web-dev-qa-db-ja.com

ファイル名を含む文字列を検索しています

ディレクトリに大量のファイルがあります。ファイルには任意のテキストが含まれています。

その特定のファイルテキスト内のファイル名を検索したいと思います。明確にするために、私はfile1.py.txt(はい、2つのドット.py.txt)とfile2.py.txtの両方にテキストが含まれています。 @code prefix.file1.py内の文字列file1.py.txtの存在と、@code prefix.file2.py内の文字列file2.py.txtの存在を検索したい

ディレクトリ内のすべてのファイルを調べ、その特定のファイル名を使用して各ファイル内の文字列を検索するようにgrepをカスタマイズするにはどうすればよいですか?

編集:

私が探している出力は、ファイル名(一致が見つかった場合)、行テキスト(一致が見つかった場合)を含む別のファイルresult.txtに書き込まれます。

4
user9371654

GNU awk

_gawk '
  BEGINFILE{search = "@code prefix." substr(FILENAME, 3, length(FILENAME) - 6)}
  index($0, search)' ./*.py.txt
_

一致する行を報告します。

ファイル名と一致する行を出力するには、index($0, search)を次のように変更します。

_  index($0, search) {print FILENAME": "$0}
_

または、ファイル名のみを出力するには:

_  index($0, search) {print FILENAME; nextfile}
_

FILENAMEsubstr(FILENAME, 3)に置き換えて、_./_プレフィックスの出力をスキップします。

ファイルのリストは字句的にソートされています。名前が_._で始まるものは無視されます(一部のシェルには、それらを追加するためのdotglobオプションがあります。zshを使用すると、_(D)_ glob修飾子を使用することもできます。 )。

8

見つかった各ファイルをgrepする必要があります。

-lは、grepが見つかった場合にのみファイル名を出力するようにregexに指示します。

ファイル名に/ charが含まれていない場合は、次のことを試してください。

find a_directory -type f -name \*.py.txt -exec sh -c '
  for fname; do
    basename="${fname##*/}"
    grep -lF "@code prefix.${basename%.*}" "${fname}"
  done' sh {} +

以下の項目については、man bashを参照してください。

  • fname == "${fname##*/}"の場合、file1.py.txta_directory/file1.py.txtです。
  • basename == "${basename%.*}"の場合、file1.pyfile1.py.txtです。
3
Jay jargot