現在のディレクトリで単語を含まない(を使用して)ファイルを見つけるにはどうすればよいですか?foo
grep
現在のディレクトリで単語を含まない(を使用して)ファイルを見つけるにはどうすればよいですか?foo
grep
回答:
grepに-L
(または--files-without-match
)オプションがある場合:
$ grep -L "foo" *
GREP_OPTIONS='--exclude-dir=.svn --exclude-dir=.git'
:^)
-rL
代わりに使用-L
grep -L 'foo' -- *
。標準では、長いオプションを取るコマンドは、--
この時点以降にオプションがないことを示すために使用されます。
grepだけで(検索なしで)実行できます。
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
次のコマンドは、パターンを含まないすべてのファイルを取得しますfoo
。
find . -not -ipath '.*svn*' -exec grep -H -E -o -c "foo" {} \; | grep 0
grep '0$'
、10行の倍数のファイルにも一致します。grep ':0$'
最後に、行の終わりに明示的な「:0」があるかどうかを確認する必要があります。次に、一致する行がゼロのファイルのみを取得します。
次のコマンドでは、検索でsvn
2番目のを使用してフォルダーをフィルターで除外する必要がありませんgrep
。
grep -rL "foo" ./* | grep -v "\.svn"
あなたは実際に必要になります:
find . -not -ipath '.*svn*' -exec grep -H -E -o -c "foo" {} \; | grep :0\$
問題
.phtml
インラインPHPコードを使用してHTMLを書き出すためにファイルを使用する大規模なプロジェクトをリファクタリングする必要があります。代わりにMustacheテンプレートを使用したいと思います。.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
一致した各パスでコマンドを実行します
グレップ
-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には-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 ">"
diff
、システムがサポートしている場合は、2つの出力ストリームの間で実際に行うことができます(コマンドをかっこで囲み、そこに山かっこもあると思います)。それはサポートしていないので、問題ですgrep -L
@tukanがコメントしたように、-L
/ に関するAgの未解決のバグレポートがあります。--files-without-matches
フラグ。
バグレポートの進捗状況はほとんどないため、-L
以下のオプションは当てにしないでください。が解決されていない限り、。代わりに、このスレッドで提示されているさまざまなアプローチを使用してください。バグレポートへのコメントの引用[強調は私のもの]:
これに関する更新はありますか?
-L
ファイルの最初の行の一致を完全に無視します。これはすぐには修正されないようですが、実際には宣伝されているように機能しないため、フラグは完全に削除する必要があります。
の強力な代替手段として、シルバーサーチャー-Agをgrep
使用できます。
速度に重点を置いた、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
現在のディレクトリで一致しないファイルのみを検索foo
するに--depth=0
は、再帰を指定します。
ag -L foo --depth 0
grep -irnw "filepath" -ve "pattern"
または
grep -ve "pattern" < file
上記のコマンドは、-vが検索されているパターンの逆を見つけるので、結果を提供します
-l
ファイル名だけを印刷するオプションを追加できます。しかし、これはパターンを含まない行を含むファイルの名前を出力します。OPは、パターンを含む行を含まないファイルを検索したいと考えています。
次のコマンドは、部分文字列「foo」を含む行をフィルタリングするのに役立ちます。
cat file | grep -v "foo"
cat
。