4

この行を使用して、自分がいるディレクトリとそのすべてのサブディレクトリ内のファイル内で「B206」というフレーズを見つけました。

find . -exec grep -s "B206" '{}' \; -print 

特定のファイルを読み込もうとするとクラッシュし、実際にパテのタイトルバーを奇妙な文字の束に変更します

たとえば、サブディレクトリにあるjpgファイルにヒットすると常にクラッシュします。タイトルバーが変わり、画面に次のように表示されます。

ÐF»*rkNQeË+Z׳kU£~MÞçÄZ½ªéúýØâÑn¡[U+Þ4ªÒ9/ê£<ú¯4}[IÓ­îÃ¥K»G%ݳ¢

Ctrl + Cを押してプロンプトに戻り、終了します。

jpgファイルを除外するコードをこの行に追加する方法はありますか?さらに良いことに、除外する拡張機能のリストを追加できるコードはありますか?


編集:
-not&-私は私のために働いていません
私はこの同様の質問が私のものにもいくらか関連していることを発見しました

4

12 に答える 12

8

使用する理由はありませんfindgrep再帰オプションが付属しています-r。(すべてのファイルの一致するすべての行のリストではなく)一致するファイル名のリストを取得するには、この-lオプションを使用できます。すべてのバイナリファイルを完全に無視したい場合は、--binary-files=without-matchオプションを使用できます。特定の拡張子を持つファイルのみを無視する場合は、--excludeオプションを使用できます。たとえば、または--exclude=*.{jpg,jpeg}で終わるすべてのファイルを無視します。したがって、これで必要なものを取得できるはずです。.jpg.jpeg

grep -r -l --binary-files=without-match .

さて、あなたはあなたのコメントの1つで、あなたのバージョンにはまたはオプションgrepがないと述べました。それは残念なことであり、より新しいバージョン(できればGNUの種類)を入手することをお勧めします。-r-lgrep

さらにもう1つ注意してください。を使用する場合は、セミコロンの代わりにコマンドを終了するために使用する必要があります。例find -exec+

find . -exec grep options '{}' '+'

を使用する+と、find単一のプロセスのみがフォークされ、一致するすべてのファイル名がコマンドライン引数として。の1つのインスタンスに渡されますgrep。一致するファイルが100万個ない限り(シェルが処理できるよりもはるかに長いコマンドラインが作成されます)、これははるかに高速になります。代わりにセミコロンを使用する場合は、一致するファイルごとfindに新しいプロセスをフォークします。これは、非常に多数のファイルの場合は非常に低速です。

于 2009-06-22T16:08:21.170 に答える
4

ご使用の環境で派手なgrepを実行できない場合は、awkで実行できる可能性があります。

find . | awk '!/((\.jpeg)|(\.jpg)|(\.png))$/ {print $0;}' | xargs grep "B206"
于 2009-06-22T16:54:46.307 に答える
3

grepの-Iスイッチを使用できます。

Process  a  binary  file as if it did not contain matching data;
this is equivalent to the --binary-files=without-match option.

つまり、grepはファイルが一致しないと単純に想定し、バイナリデータが出力されないようにします。

于 2009-06-22T15:51:06.500 に答える
3

引用符だけです。ターミナルを閉じる必要はありません。コマンドを使用してreset、ターミナルの出力モードを復元できます。

以前のgrepを実行して、不要な拡張機能を削除することもできます。

find -print | grep -v '\(\.jpg\|\.bmp\)$' | xargs grep "B206"
于 2009-06-22T16:36:36.123 に答える
2

Erikのコマンドを試しましたが、-grep述語がないというエラーが発生しました。おそらく私のバージョンのfindは古すぎます。

これは私のために働いた:

find . -type f -a -not -name \*.jpg -exec grep "B206" {} \;
于 2009-06-22T15:58:35.660 に答える
2
探す 。-type f -a -not -name\*。jpg-execgrep -li "string" "{}" \;

この例はMacOSX10.5からのものです。GNUfindと他のベンダーの実装の間には多少の相違があるため、ご使用の環境のfindmanページを確認する必要があります。Solarisのチェック(楽しみのために、ターゲットOSは指定されていません):

探す 。-タイプf-a!-name\*。jpg-execgrep -li "string" "{}" \;

この構造は、名前が.jpgで終わらないすべてのファイルを検索し、それぞれのファイルをexecsgrepします。

シェルによっては、これが宣伝どおりに機能するために、強打(!)をエスケープする必要がある場合があります。

于 2009-06-22T15:47:30.060 に答える
2

最近のackをめぐるラブフェストを考えると、まだ誰もそれについて言及していないことに驚いています。

必要なファイルだけを「grep」するように、拡張子でタイプを構成できます。または、直面している問題を考慮して、-nobinaryを使用することもできます。

于 2009-06-22T17:07:26.883 に答える
1
grep -r --exclude=*.jpg B206 .

申し訳ありませんが、別のコメントから:

GNU grepにのみ-r(再帰的)が付属していますが、真のUNIXgrepには付属していません。GNU grepをインストールするか、findで使用する必要があります。–ターミナス

于 2009-06-22T16:13:26.040 に答える
1

findでgrepを使用するための構文は、次のとおりです。

find . -name "*" -print | xargs grep B206

ファイル、バイナリ、およびすべてをフィルタリングするためのすべてのオプション。結果は、引数としてgrepコマンドに渡されます。

于 2009-06-22T16:15:20.550 に答える
1

gfindにアクセスできる場合は、式に「-not-name'*.jpg'」を追加するだけです。

gfind . -not -name '*.jpg' -exec grep -s "B206" '{}' \; -print

別のオプション(このタスクには必要ありませんが、便利なトリック)は、本当に派手な正規表現を使用したい場合は、

some_easy_high_level_filter_expression-lsを検索| perl -pe'{/ your_Perl_RegExp_of_choice /}'> ./files_to_search_in

grepオプション'cat./files_to_search_in'

前の行にはバッククォートが必要ですが、フォーマッターにバッククォートをエスケープさせることができません

これにより、grep式を変更して微調整したり、1つ以上のgrepを実行したりする場合に、ファイルリストをキャッシュするという利点が得られます。

于 2009-06-22T15:53:25.223 に答える
1

問題は、バイナリファイルをgrepすると、バイナリデータが出力されることだと思います。そのバイナリデータはどういうわけかあなたのシェルで解釈されます。

最初に出力がテキストのみであることを確認するコマンド「strings」を使用してから、「strings」の出力をgrepすることをお勧めします。

于 2009-06-22T16:19:38.257 に答える
0

grep -I -r "string" *

于 2009-06-22T15:55:34.413 に答える