
find
文字列を検索するときにファイル名と行番号をどのように返しますか?あるコマンドはファイル名を返し、別のコマンドでは行番号を返しましたが、それらを組み合わせることはできないようです。
ファイル名:find . -type f -exec grep -l 'string to search' {} \;
行番号:find . -type f -exec grep -n 'string to search' {} \;
答え1
答え2
非標準-H
または-r
/-R
オプションを使用しない限り、grep
ファイル名は複数のファイル名が渡されたときにのみ出力されるため、次のことができます。
find . -type f -exec grep -n 'string to search' /dev/null {} +
{} +
構文を使用するとfind
必要なだけ多くのファイルを渡しますgrep
が、 を使用すると各ファイルに対して 1 つずつ{} ';'
実行するためgrep
、非常に非効率的です。
/dev/null
少なくとも2つのファイルを取得するために追加(存在し、空であることを保証)しますgrep
。これは、現在のディレクトリまたは下のディレクトリに通常のファイルが1つしかない場合、またはファイルのリストが次のように分割さfind
れている場合に適しています。最後の実行にはファイルが1つしかなかった方法です。
ちなみに、次の-exec grep regex {} +
場合find
の終了状態はゼロではありません。どのgrep
ゼロ以外の終了状態で終了するコールです。find
特定のディレクトリを閲覧/読み取りできない場合、またはファイルメタデータを取得できない場合でも、ゼロではありません。find
返された終了ステータスが0の場合、すべてのディレクトリをfind
参照できます。みんな grep
呼び出しは成功しますが(少なくとも1つの一致がある1つ以上のファイルが見つかりました)、ゼロ以外の値を返しても必ずしも一致が見つからなかったわけではありません。
の終了状態は、-exec grep regex {} ';'
述語(条件として使用可能)が成功したかどうかを確認するためにのみ使用され、終了状態には反映されません。 soの終了ステータスは、すべてのファイルが見つかるかどうかにのみ関連します。grep
-exec
find
find
答え3
grepが再帰-r
フラグをサポートしている場合、要求は解決される可能性があります。
grep -rn "String to search " *