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 を組み合わせワンライナーで利用する