ソースコードではなくプレーンテキストファイルからのみ検索

ソースコードではなくプレーンテキストファイルからのみ検索

ELF次のコマンドを使用して、現在のディレクトリのプレーンテキストファイルから文字列を再帰的に取得します。

grep ELF -r .

しかし、バイナリファイル(例えば、zipファイル、PDFファイル)だけでなく、HTMLファイルと.js

ソースコードではなくプレーンテキストファイルでのみ検索するように指定するにはどうすればよいですか?

答え1

GNU grep を使用して--binary-files=without-matchバイナリを無視して渡します。ソースコードファイルはテキストファイルなので、結果に含まれます。

特定の拡張子を持つテキストファイルを無視したい場合は、このオプションを使用できます--exclude

grep -r --exclude='*.html' --exclude='*.js' …

あるいは、明示的に一致するファイルのみを含めることもできます。

grep -r --include='*.txt' …

ソースコードであるテキストファイルを無視するには、次のようにします。file注文するどのファイルがソースコードであるかを見てみましょう。これは、経験的な方法を使用してソースコードをソースコードではないと検出したり、その逆を検出したりできます。

find -type f exec sh -c '
  for x do
    case $(file <"$x") in
      *source*) :;; # looks like source code
      *text*) grep -H -e "$0" "$x";; # looks like text
      # else: looks like binary
    esac
  done
' "REGEXP" {} +

または

find -type f exec sh -c '
  for x do
    case $(file -i <"$x") in
      text/plain\;*) grep -H -e "$0" "$x";; # looks like text
      # else: looks like source code or binary
    esac
  done
' "REGEXP" {} +

または、次のものを使用できます。確認するgrepの代わりに。 Ackはファイル名に基づいてファイル分類システムを統合します。デフォルトではソースコードから検索するのに適していますが、optionsを渡して他の種類を検索するように指示できます--typeackを使用してすべてのファイルを検索する役に立つかもしれません。

答え2

ファイル拡張子のみに制限するには、grep --includeオプションを使用できます。

grep -R --include="*.txt" "pattern" /path/to/dir/

別の方法はテキストではありませんが、htmlファイルとjsファイルを含むファイルを削除し、更新後に--excludeオプションを使用してこれらのファイルを除外することです。例:

find /path/to/dir -type f -print | xargs file | grep text | cut -f1 -d: | xargs grep --exclude=\*.{js,html} "pattern"

コメントで述べたように、 --exclude-from=FILE オプションを使用することもできます。

関連情報