Skip to content

Instantly share code, notes, and snippets.

@xtetsuji
Last active October 30, 2017 06:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save xtetsuji/6188fbaed7418425b5fd1684be7211b1 to your computer and use it in GitHub Desktop.
Save xtetsuji/6188fbaed7418425b5fd1684be7211b1 to your computer and use it in GitHub Desktop.
progress printing tar command, alpha quality :)
#!/bin/bash
# xtetsuji 2017/10/30
# pptar - progress printing tar
# This is alpha quality :)
# https://twitter.com/xtetsuji/status/924861905893593088
SLEEP_SECONDS=1
TAR_FILE_LOG=/tmp/tar_file.$$.log
function kill_children {
rm -f $TAR_FILE_LOG
pkill -P $$
wait
}
trap kill_children EXIT
set -eu
opt=$1
dst=$2
src=$3
if [ $opt = ${opt/v/} ] ; then
# v を削った $opt が元と同じということは v が無かったということ
# v を付けて、実際は $TAR_FILE_LOG へファイルリダイレクトする
opt=${opt}v
fi
tar "$opt" "$dst" "$src" > $TAR_FILE_LOG 2>&1 &
tar_pid=$!
# ファイルが作られるまで一瞬待つ
sleep 1
while [ ! -f $dst ] ; do
echo "$dst is not created yet"
sleep 1
done
# $dst ファイル監視
while true ; do
printf "\r%s [%d MB] [%d num]" \
$dst \
$(du -sm $dst | sed -e 's/[^0-9].*//') \
$(wc -l $TAR_FILE_LOG | sed -e 's/^ *//' -e 's/ .*//')
# シグナル番号 0 で、その PID のプロセスの存在を確認
if ! kill -0 $tar_pid 2>/dev/null ; then
echo ""
break
fi
sleep $SLEEP_SECONDS
done
# tar のファイル出力は、特に実際のアーカイブファイルへの追加操作と同期しているわけでもないので、逐次で見せなくてもいいかも(誤解もありそうだし)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment