特定の拡張子を持っているが特定のテキストを含まないファイルを見つけるスクリプト

特定の拡張子を持っているが特定のテキストを含まないファイルを見つけるスクリプト

デフォルトでは、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-oand、!not -and-orおよびです-not

ファイルの内容内で文字列を見つけるには、findwith grep(たとえば)を使用する必要があります。

関連情報