find結果をlsで表示(xargsのr, no-run-if-emptyオプション)

By | 2015/03/18 12:34 PM

find結果をlsで表示する場合、find結果が無い場合に単純にls単発の結果が表示され、予想していた結果にならずにハマりました。

7日前から現在までに更新されたファイルをfindで検索し、結果をlsで表示

まずはfindのmtimeオプションについて。

find: -mtime n
ファイルのデータが最後に修正されたのが n*24 時間前なら真。

一例を載せておきます。

findの -print0 オプション とxargsの -0 オプション の組み合わせは、
スペースが含まれているファイル名も正常に検索してくれるので、つける癖をつけています。

find: -print0
真を返す。ファイル名をフルパスで標準出力に表示し、各ファイル名にヌル文字を付加する。
このオプションを用いれば、 find の出力を処理するプログラムにおいて改行文字を含んだ
ファイル名を正しく解釈できるようになる。

xargs: --null, -0
標準入力からの文字列の区切りに、空白ではなくヌル文字が使われているとみなす。また引用符やバックスラッシュに特別の意味を持たせず、すべての文字をそのまま用いる。
ファイル終了文字列も無効となり、他の文字列と同じように扱われる。
入力される文字列に空白・引用符・バックスラッシュが含まれている場合に有用であろう。
GNU find の -print0 オプションの出力を、このオプションを指定した xargs の入力とすると良い。

xargsの -r 、または --no-run-if-empty オプションは、標準入力が空の場合は何もしません。
このオプションをつけた場合、find結果が空の場合に何も表示されなくなり、期待していた結果となります。

xargs: -r, --no-run-if-empty
標準入力に空行しか含まれていない場合、コマンドを実行しない。
通常は入力がない場合でもコマンドは一回実行される。

この記事を書いた人

MoriMori
MoriMori
2007年11月 27歳にしてプログラマーとしての道を志し、某就職支援会社のPHPスクールに通い始める
2007年12月 株式会社パクレゼルヴに紹介予定派遣社員として入社
2008年4月 株式会社パクレゼルヴの正社員となる
2013年4月 株式会社PRECSとして分社後も在籍

70% WEBエンジニア、30% インフラエンジニア