YANO's digital garage

Copyright ©YANO All rights reserved. https://www.bravotouring.com/~yano/

Last-modified: 2024-05-07 (火)


[一語一絵/IT系]

findのTips / 2013-02-26 (火)

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