findとxargsとtarを組み合わせた backup Tips。
#!/bin/bash
TSTAMP=`date +%Y%m%d_%H%M%S`;
find $1 \( -name \*.[ch] -o -name \*.mak -o -name \*.txt -o -name \*.ini \) -print0 \
| xargs -0 tar jcvf $1_${TSTAMP}.tar.bz2;
ポイントは
find コマンドの -print0 オプションと、xargs コマンドの -0 オプションを組み合わせると、検索条件に一致したファイル(ディレクトリ)名にスペース・引用符・バックスラッシュなどが含まれていても適切に処理することができる。
だそうだが、kernel tree等で数千のファイルが対象となるような場合はそもそも
xargsでも一発では無理なので、最後の
xargsセッションしかtarされない問題があるので、以下のように
xargsではなく
-Tオプションでファイルリストを標準入力から渡すのが正解。
#!/bin/bash
TSTAMP=`date +%Y%m%d_%H%M%S`;
find $1 \( -name \*.[ch] -o -name \*.mak -o -name \*.txt -o -name \*.ini \) -print0 \
| tar jcvf $1_${TSTAMP}.tar.bz2 -T -;
また、7日以内に更新したファイルを固めたい場合は
#!/bin/bash
TSTAMP=`date +%Y%m%d_%H%M%S`;
find $1 -mtime -7 -print0 \
| tar jcvf $1_${TSTAMP}.tar.bz2 -T -;
となる。
.bakを削除する場合は
find . -name \*.bak -exec rm {} \;
でもできるが、これだとマッチしたファイルの数だけrmプロセスが動くので、意外にも下の方が賢いそうだ。findで全くヒットしなかった場合に動作しないよう
xargsに
-rオプションを付けるのがポイント。
find . -name \*.bak | xargs -r rm;
【参照】
●maruko2 Note. http://www.maruko2.com/
┗find, tar, ssh を組み合わせワンライナーで利用する