web-dev-qa-db-ja.com

特定の文字列パターンを含まないファイルを見つけるにはどうすればよいですか?

notにWord fooname__が含まれている(grepname__を使用して)現在のディレクトリ内の files を見つけるにはどうすればよいですか?

459
Senthil Kumar

次のコマンドは、パターンfooを含まないすべてのファイルを表示します。

find .  -not  -ipath '.*svn*' -exec  grep  -H -E -o -c  "foo"  {} \; | grep 0
15
Senthil Kumar

Grepに-L(または--files-without-match)オプションがある場合

$ grep -L "foo" *
732
ghostdog74

ack を見てください。それはあなたのための.svn排除を自動的にし、あなたにPerl正規表現を与え、そして単一のPerlプログラムの簡単なダウンロードです。

ackでは、探しているものと同等のものが必要です。

ack -L foo
44
Andy Lester

次のコマンドは、2番目のsvnを使用してfindがgrepフォルダーを除外する必要性を排除します。

grep -rL "foo" ./* | grep -v "\.svn"
13
user999305

あなたは実際に必要になります:

find .  -not  -ipath '.*svn*' -exec  grep  -H -E -o -c  "foo"  {} \; | grep :0\$
9
Forrest Tiffany

私は幸運でした

grep -H -E -o -c "foo" */*/*.ext | grep ext:0

私のgrep -vの試みは私に "foo"なしですべての行を与えただけです。

6
Johnny

find *20161109* -mtime -2|grep -vwE "(TRIGGER)"

フィルタは "find"の下に、除外文字列は "grep -vwE"の下に指定できます。修正した時間でもフィルタリングする必要がある場合は、findの下でmtimeを使用してください。

1
zandeep

私のgrepには-Lオプションはありません。私はこれを達成するための回避策を見つけます。

考えは次のとおりです。

  1. 適切な文字列を含むすべてのファイル名をtxt1.txtにダンプします。
  2. ディレクトリ内のすべてのファイル名をtxt2.txtにダンプします。
  3. diffコマンドで2つのダンプファイルの違いを確認してください。

    grep 'foo' *.log | cut -c1-14 | uniq > txt1.txt
    grep * *.log | cut -c1-14 | uniq > txt2.txt
    diff txt1.txt txt2.txt | grep ">"
    
1
user6305682

バグレポートを開く

@tukanによってコメントされたように、-L/--files-without-matchesフラグに関するAgの未解決のバグレポートがあります。

バグ報告にはほとんど進歩がないので、下記の-Lオプションは、バグが解決されていない限り、に依存しないでください。代わりにこのスレッドで提示されているさまざまなアプローチを使用してください。バグレポートへのコメントを引用する[強調]

これについての更新は? -Lはファイルの最初の行の一致を完全に無視します。これが間もなく修正されない場合、フラグは完全に削除されるべきです。事実上、宣伝どおりに機能しないためです


Silver Searcher - Ag(意図した機能 - バグレポートを参照)

grepの強力な代替手段として、 The Silver Searcher - Ag を使用することができます。

速度を重視したackに似たコード検索ツール。

man agを見ると、-Lまたは--files-without-matchesオプションがあります。

...

OPTIONS
    ...

    -L --files-without-matches
           Only print the names of files that don´t contain matches.

つまり、再帰的にに移動して、現在のディレクトリからfooと一致しないファイルを検索します。

ag -L foo

currentディレクトリだけでfooと一致しないファイルを検索するには、単に再帰に--depth=0を指定します。

ag -L foo --depth 0
1
dfri

問題

私はインラインPHPコードを使ってHTMLを書き出すために.phtmlファイルを使う大きなプロジェクトをリファクタリングする必要があります。代わりに 口ひげ テンプレートを使用したいです。文字列.phtmlを含まないすべてのnew Mustacheジャイルは、まだ書き換える必要があるので見つけたいと思います。

解決策

find . -iname '*.phtml' -exec grep -H -E -o -c 'new Mustache' {} \; | grep :0$ | sed 's/..$//'

説明

パイプの前に:

検索

find .このディレクトリからファイルを再帰的に探します

-iname '*.phtml'ファイル名には.phtmlを含める必要があります(iでは大文字と小文字が区別されません)。

-exec 'grep -H -E -o -c 'new Mustache' {}'一致した各パスでgrepコマンドを実行します

Grep

-H常にファイル名のヘッダを出力行で表示します。

-E拡張正規表現としてパターンを解釈します(すなわちgrepをegrepとして振る舞わせる)。

-o行の一致部分のみを印刷します。

-c選択された行の数だけが標準出力に書き込まれます。


これにより、.phtmlで終わるすべてのファイルパスのリストが、それぞれの中で文字列new Mustacheが出現する回数の数とともに表示されます。

$> find . -iname '*.phtml$' -exec 'grep -H -E -o -c 'new Mustache' {}'\;

./app/MyApp/Customer/View/Account/quickcodemanagestore.phtml:0
./app/MyApp/Customer/View/Account/studio.phtml:0
./app/MyApp/Customer/View/Account/orders.phtml:1
./app/MyApp/Customer/View/Account/banking.phtml:1
./app/MyApp/Customer/View/Account/applycomplete.phtml:1
./app/MyApp/Customer/View/Account/catalogue.phtml:1
./app/MyApp/Customer/View/Account/classadd.phtml:0
./app/MyApp/Customer/View/Account/orders-trade.phtml:0

最初のパイプgrep :0$は、このリストをフィルター処理して、:0で終わる行のみを含めます。

$> find . -iname '*.phtml' -exec grep -H -E -o -c 'new Mustache' {} \; | grep :0$

./app/MyApp/Customer/View/Account/quickcodemanagestore.phtml:0
./app/MyApp/Customer/View/Account/studio.phtml:0
./app/MyApp/Customer/View/Account/classadd.phtml:0
./app/MyApp/Customer/View/Account/orders-trade.phtml:0

2番目のパイプsed 's/..$//'は各行の最後の2文字を取り除き、ファイルパスだけを残します。

$> find . -iname '*.phtml' -exec grep -H -E -o -c 'new Mustache' {} \; | grep :0$ | sed 's/..$//'

./app/MyApp/Customer/View/Account/quickcodemanagestore.phtml
./app/MyApp/Customer/View/Account/studio.phtml
./app/MyApp/Customer/View/Account/classadd.phtml
./app/MyApp/Customer/View/Account/orders-trade.phtml
1
Gruffy

Grepだけでそれを実行できます(findなし)。

grep -riL "foo" .

これはgrepで使用されるパラメータの説明です

     -L, --files-without-match
             each file processed.
     -R, -r, --recursive
             Recursively search subdirectories listed.

     -i, --ignore-case
             Perform case insensitive matching.

l(小文字)を使用すると、逆の結果になります(一致するファイル)。

     -l, --files-with-matches
             Only the names of files containing selected lines are written
0
Adrian