notにWord foo
name__が含まれている(grep
name__を使用して)現在のディレクトリ内の files を見つけるにはどうすればよいですか?
次のコマンドは、パターンfoo
を含まないすべてのファイルを表示します。
find . -not -ipath '.*svn*' -exec grep -H -E -o -c "foo" {} \; | grep 0
Grepに-L
(または--files-without-match
)オプションがある場合
$ grep -L "foo" *
ack
を見てください。それはあなたのための.svn
排除を自動的にし、あなたにPerl正規表現を与え、そして単一のPerlプログラムの簡単なダウンロードです。
ack
では、探しているものと同等のものが必要です。
ack -L foo
次のコマンドは、2番目のsvn
を使用してfindがgrep
フォルダーを除外する必要性を排除します。
grep -rL "foo" ./* | grep -v "\.svn"
あなたは実際に必要になります:
find . -not -ipath '.*svn*' -exec grep -H -E -o -c "foo" {} \; | grep :0\$
私は幸運でした
grep -H -E -o -c "foo" */*/*.ext | grep ext:0
私のgrep -v
の試みは私に "foo"なしですべての行を与えただけです。
find *20161109* -mtime -2|grep -vwE "(TRIGGER)"
フィルタは "find"の下に、除外文字列は "grep -vwE"の下に指定できます。修正した時間でもフィルタリングする必要がある場合は、findの下でmtimeを使用してください。
私のgrepには-Lオプションはありません。私はこれを達成するための回避策を見つけます。
考えは次のとおりです。
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 ">"
@tukanによってコメントされたように、-L
/--files-without-matches
フラグに関するAgの未解決のバグレポートがあります。
バグ報告にはほとんど進歩がないので、下記の-L
オプションは、バグが解決されていない限り、に依存しないでください。代わりにこのスレッドで提示されているさまざまなアプローチを使用してください。バグレポートへのコメントを引用する[強調]
これについての更新は?
-L
はファイルの最初の行の一致を完全に無視します。これが間もなく修正されない場合、フラグは完全に削除されるべきです。事実上、宣伝どおりに機能しないためです。
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
問題
私はインライン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
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