何も見つからないときに検索が失敗するようにする

何も見つからないときに検索が失敗するようにする

呼び出し時にfindファイルが見つからない場合は、まだコード0で終了します。ファイルが見つからないときに失敗を示す終了コードを返す方法はありますか?

答え1

grepNULで区切られた行(GNUなどgrep)の読み取りをサポートしている場合は、-zそれを使用して出力される項目があるかどうかをテストできますfind

find /some/path -print0 | grep -qz .

データを別のコマンドにパイプするには、オプションを削除してデータを変更せずにそのままにし、-q結果grepがない場合はエラーを報告できます。

find /some/path -print0 | grep -z . | ...

特に${PIPESTATUS[1]}終了ステータスはbashに保存する必要がありますgrep

findこれをサポートしていない場合は、grepなしで-print0使用し-z、ファイル名に改行が問題を引き起こさないことを願っています。

find ... | grep '^' | ...

この場合、^代わりに使用する方が.安全です。出力に連続した改行文字がある場合は^無視されますが、.そうではありません。

答え2

具体的には戻りコードをリクエストしました。オプションに対応する項目は表示されません。しかし、これが私が解決した方法です(grep -zMacポートではないので)。

1行が見つかったら、コード0を指定してください。

test 1 == `find */.kitchen/ -name private_key | wc -l`

だから...

if [ 0 == `find */.kitchen/ -name my-file.txt | wc -l` ] ; then
   echo "Nothing found"; exit;
fi

また、一般的な解決策として、以下が役に立ちます。

パイプが空であることを確認し、空の場合は、データに対してコマンドを実行します。

答え3

私はこの質問に非常に遅れていましたが、ちょうどエレガントな答えを見つけました:-)

find . -type d -empty -and -not -name . -print -exec rmdir {} + | \
  awk '{print} END {if (NR == 0) {exit(1)}}'

findここでは、現在のディレクトリで空のディレクトリを探し、空のディレクトリを削除し、削除された ディレクトリの名前をパイプに印刷し、出力を印刷
し、出力がない場合はエラーコードで終了します。

awkfindNR == 0

これは、空のディレクトリを繰り返すことができることを意味します。

while find . -type d -empty -and -not -name . -print -exec rmdir {} + | \
  awk '{print} END {if (NR == 0) {exit(1)}}'; \
do echo; done

「my」パラメータを希望のfindものに置き換え、端末に表示される出力を望まない場合はその部分を保持し、awkその部分を保持しないと「voila」になります。{print}find

関連情報