私は、特定のディレクトリのファイルが最近変更されたことを確認する必要があるスクリプトを作成しています。簡単に使えると思いましたが、find
一致するものが見つからなくても成功を報告します。
$ touch afile
$ find . -mtime -1 -iname ????*
./afile
$ echo $?
0
$ find . -mtime +1 -iname ????*
$ echo $?
0
(「.」を除外するためにiname述語を使用しましたが、同じ動作-type f
)
ls
私はこのような出力を解析したくありません。性格が悪いかもしれません。。
を使用すると、test -n "$(find . -mtime -1 -iname ????*)"
期待した結果が得られるようですが、特にエレガントなソリューションではないようです。
どのファイルが変更されたかを知る必要はありません。ただ最近ファイルが変更されただけです(「最も最近」は通常1日です)。
もっと良い方法がありますか?
(Googleで検索すると、簡単な検索を実行する方法に関するSEO関連の不満がたくさんあります。)
ベストアンサー1
はい、ご覧のとおり、findの終了コードを使用してこのようなことを行うことはできません。終了コードは、ファイルが見つかったかどうかではなく、コマンドが正常に実行されたかどうかに関連します。結局のところ、ファイルが見つからないのは失敗ではなく成功です。ファイルがない正しい結果が得られます。これman find
の説明は次のとおりです(GNU findから引用)。
終了ステータス
すべてのファイルが正常に処理されると、find は状態 0 で終了し、エラーが発生すると状態は 0 より大きくなります。これは意図的に非常に広範な説明ですが、戻り値がゼロでない場合は、結果の精度に依存しないでください。探す。
特定のエラーが発生すると、指定されたすべての操作を完了せずにfindがすぐに停止することがあります。たとえば、一部の始点はまだ確認されていないか、一部の保留中のプログラム呼び出しがある可能性があります。 -exec...{}+または-execdir...{}+まだ実装されていない可能性があります。
あなたは実際にそれを使用することができます-n $(find ...)
。私はそこに実際に問題を見ません。ファイル名は含めることができないため、NUL
これが壊れる可能性がある状況は考えられません。もっときちんとしたい場合は、配列を使用してから、配列の要素数を超えたかどうかをテストできます0
。このような:
$ findResults=( $(find . -mtime -1 -iname '????*' | head -n1) )
$ [[ ${#findResults[@]} -gt 0 ]] && echo "Found files!" || echo "No files found!"
Found files!
$ findResults=( $(find . -mtime +1 -iname '????*' | head -n1) )
$ [[ ${#findResults[@]} -gt 0 ]] && echo "Found files!" || echo "No files found!"
No files found!
しかし正直、これが[[ -n $(find ...) ]] && echo found || echo nope
。