파일 이름이 포함된 문자열 검색

파일 이름이 포함된 문자열 검색

내 디렉토리에 많은 파일 세트가 있습니다. 이러한 파일에는 임의의 텍스트가 포함되어 있습니다.

해당 특정 파일의 텍스트 내에서 파일 이름을 검색하고 싶습니다. 명확히 하기 위해 file1.py.txt(예, 점 두 개 .py.txt) 있고 file2.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

관련 정보