デフォルトでは、find(または他の方法)を使用して*.pまたは*.wで終わるがsysvars.iまたはpreprocess.iを含まないすべてのファイルを見つけるために再帰的に検索するスクリプトを作成しようとしています。
使用に最適なコマンドをお探しですか?
答え1
find
とタスクを組み合わせgrep
てこれを行うことができます。
find /search/path/ -type f \( -name '*.p' -or -name '*.w' \) \
-exec grep -L -e 'sysvars.i' -e 'preprocess.i' {} +
それを分析しましょう。
find /serch/path
指定されたパスのすべてのファイルを返します。次に、後で他の項目をチェックする時間を節約するために、最も多くの一致を削除する項目から始めて範囲を絞り込む必要があります。-type f
ファイルのみが返されます。ファイル名パターンと一致するディレクトリがある場合は、そのディレクトリをgrep
。\( [expr1] -or [expr2] \)
find が expr1 または expr2 と一致するファイルを返すように、いずれかまたは一致を作成します。しかし、両方とも一致する理由はありません。括弧は区別するのに役立ちます。または実際の残りの一致オプションにグループ化そして必要です。-name '*.p'
そして-name '*.w'
明らかに、これらの名前パターンと一致するファイルが返されます。-exec command {} +
指定されたコマンドと引数が実行され、そのビット{}
がコマンドの残りの部分と一致する各ファイルの引数に置き換えられますfind
。この-exec
関数はxargs
参照とファイル名の問題をうまく処理するので、ループを使用するかループにパイプするよりも優れています。grep
指定されたファイルからパターンを検索するために使用されます。-L
一致しないファイル名のリストのみを返すために使用されます。-e 'PATTERN'
一致させない2つの検索文字列をリストするには、2回指定します。
答え2
テストを見つけるための複雑なブール式を設定できます。
find . \( -name '*.p' -or -name '*.w' \) -and \
-not \( -name 'sysvars.i' -or -name 'preprocess.i' \)
Posix互換オプション名は-a
、-o
and、!
not -and
、-or
およびです-not
。
ファイルの内容内で文字列を見つけるには、find
with grep
(たとえば)を使用する必要があります。