findのTips

findxargstarを組み合わせた 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/