tarの--listed-incrementalオプション。これまで-Nを使ったり、findで新しいファイル名を探していたけど、tarの実行中はどうなるんだ、というのがあった。しょうがないので余裕を持たせて、
LC_ALL=C date > timestamp.new
tar cfz outXXXX.tar.gz -N "$(cat timestamp)"
mv timestamp.new timestamp
のようにしていた。厳密じゃないけどなくなるよりはずいぶん良い。そう思っていたのだが、tarの--listed-incrementalというオプションはこれを厳密にやってくれるみたいだ。上記の3行は以下のように1コマンドになる。
tar cfz outXXXX.tar.gz --listed-incremental out.stamp
short optionは-gです。
問題は、ディレクトリについてはやってくれないらしく、たとえ変更されていないディレクトリであってもアーカイブに入ってしまうことだ。であるからして、
tar tfz outXXXX.tar.gz | grep -vq '/$' || rm outXXXX.tar.gz
みたいにディレクトリのみのアーカイブを削除することになる。これだと空ディレクトリを作ったという情報だけだと保存されなくなってしまうが。