ファイル名を含む文字列の検索

ファイル名を含む文字列の検索

私のディレクトリにはたくさんのファイルセットがあります。これらのファイルには任意のテキストが含まれています。

その特定のファイルのテキスト内でファイル名を検索したいと思います。明確にするためにfile1.py.txt(はい、2つの点.py.txtfile2.py.txt、どちらもテキストを含みます。@code prefix.file1.py内部文字列が存在するか、内部file1.py.txt文字列があるかを検索したいと思います。@code prefix.file2.pyfile2.py.txt

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

編集する:

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

答え1

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}

スキップ可能な出力プレフィックスFILENAMEに置き換えられました。substr(FILENAME, 3)./

ファイルのリストは語彙順にソートされます。で始まる名前は.無視されます(一部のシェルにはdotglob再度追加するオプションがあります。を使用すると、glob修飾子をzsh使用することもできます)。(D)

答え2

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

-lgrepファイル名が見つかった場合にのみ印刷する必要があることを示します。regex

ファイル名に/文字が含まれていない場合は、以下を試してください。

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##*/}"はい、file1.py.txtもしそうならfname==a_directory/file1.py.txt
  • "${basename%.*}"はい、file1.pyもしそうならbasename==file1.py.txt

関連情報