回答:
あなたfind
自身を印刷することができますfound
:
find . -name xac -printf "found\n" -quit
-quit
ようになりますfind
最初の試合後に辞めので、found
一度だけ最大で印刷されます。
UnixとLinuxの同様のスレッド(何も見つからなかった場合にfindを失敗させる)では、何も見つからなかったgrep -qz
場合にゼロ以外の終了ステータスを返していfind
ました。
find /some/path -print0 -quit | grep -qz .
&&
またはを使用して複合コマンドを作成するために使用できるものif
:
find /some/path -print0 -quit | grep -qz . && echo found
-print0 -quit
です。その前に何を置くかは、あなたが見つけたいものに依存します。ここでは省略しました。
muruの回答は適切であり、ファイルが見つかった場合に何かを印刷したい場合に適しています。などの外部コマンドを実行する場合の一般的なケースでは、フラグecho
を使用できます-exec
。
$ find . -name 'xac' -exec echo "I found " {} \; -quit
I found ./xac
{}
一部は間のコマンドにファイル名を渡す-exec
と、\;
引数として。\
前に注意してください;
-シェルが誤って解釈するのを防ぎます;シェルの終了セミコロンはコマンドの終わりを示しますが、スラッシュでエスケープすると、シェルはそれをfind
コマンドに渡されるリテラルテキストとして扱い、コマンドを見つけるために終了-exec
フラグの引数として機能します。
if found do this; else do that
並べ替えの条件文$()
を作成するために、コマンドの置換とtest
コマンド(別名[
)を利用できます。
$ [ "x$(find . -name 'noexist' -print -quit)" != "x" ] && echo "found" || echo "not found"
not found
$ [ "x$(find . -name 'xac' -print -quit)" != "x" ] && echo "found" || echo "not found"
found
ダンのコメントへの対応
コメントのダンは尋ねました:
「私が見つけた{}」をエコーするのは、「私が見つけた」{}をエコーするよりも良いのではないですか?エコーの場合は問題ないかもしれませんが、誰かがコマンドをコピーしてエコーを別のコマンドに置き換えると、問題が発生する可能性があります
最初に問題を理解しましょう。通常、シェルには単語分割の概念があります。これは、引用符で囲まれていない変数と位置パラメータが展開され、個別のアイテムとして扱われることを意味します。たとえば、あなたが変数を持っている場合var
、それが含まれているhello world
テキストをあなたが行うとき、touch $var
シェルは、2つの個別の項目にそれを打破しますhello
と、world
とtouch
あなたは2つの別々のファイルを作成しようとしていたかのようにそれを理解します。実行するtouch "$var"
と、シェルはhello world
1つのユニットとして扱い、1 touch
つのファイルのみを作成します。これは、シェルがどのように機能するかによってのみ発生することを理解することが重要です。
対照的に、find
コマンドはfind
それ自体で処理され、execvp()
システムコールによって実行されるため、このような動作の影響を受けません。したがって、シェルは関与しません。中かっこは、シェルでは特別な意味を持っていますがfind
、最初ではなくコマンドの途中に表示されるため、この場合、シェルには特別な意味はありません。ここに例があります。いくつかの難しいファイル名を作成し、それらをstat
コマンドの引数として渡してみましょう。
$ touch with$'\t'tab.txt with$' 'space.txt with$'\n'newline.txt
$ find -type f -exec stat -c "%F" {} \; -print
regular empty file
./with?newline.txt
regular empty file
./with space.txt
regular empty file
./with?tab.txt
ご覧のとおり、でstat
難しいファイル名を完全に正常に受信しますfind
。これは、ポータブルスクリプトでの使用が推奨される主な理由の1つであり、ディレクトリツリーをトラバースしていて、それらの特殊文字。したがって、で実行されるコマンドの波括弧を引用する必要はありませんfind
。
シェルが関与するときは別の話です。ファイル名を処理するためにシェルを使用する必要がある場合があります。その場合、引用は確かに重要ですが、問題が見つからないことを認識することが重要です。単語分割を行うのはシェルです。
$ find -type f -exec bash -c "stat {}" sh \;
stat: cannot stat './with': No such file or directory
sh: line 1: newline.txt: command not found
stat: cannot stat './with': No such file or directory
stat: cannot stat 'space.txt': No such file or directory
stat: cannot stat './with': No such file or directory
stat: cannot stat 'tab.txt': No such file or directory
したがって、shell内で引用すると、機能します。しかし、繰り返しになりますが、それはシェルではなく、にとって重要ですfind
。
$ find -type f -exec bash -c "stat -c '%F' '{}'" sh \;
regular empty file
regular empty file
regular empty file
echo "I found {}"
より良いのではないでしょうecho "I found " {}
か?多分、echoの場合は問題ありませんが、コマンドをコピーしてechoを別のコマンドに置き換えると、問題が発生する可能性があります。
/some/path
どこから探し始めるかを指示しますが、何を探すべきかはわかりません。あなたのリンクされた答えでも同じです。私にとって何がうまくいくかですfind /some/path -name xac -print0 -quit | grep -qz . && echo found
。私は何か見落としてますか?