ディレクトリに大量のファイルがあります。ファイルには任意のテキストが含まれています。
その特定のファイルテキスト内のファイル名を検索したいと思います。明確にするために、私は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
に書き込まれます。
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
オプションがあります。zsh
を使用すると、_(D)
_ glob修飾子を使用することもできます。 )。
見つかった各ファイルを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.txt
はa_directory/file1.py.txt
です。basename
== "${basename%.*}"
の場合、file1.py
はfile1.py.txt
です。