파일 이름에 문자열이 있고 파일에 다른 문자열이 포함 된 파일을 찾으십니까?


17

파일 이름에 "ABC"가 있고 모든 파일에 "XYZ"가 포함 된 모든 파일을 (재귀 적으로) 찾고 싶습니다. 나는 시도했다 :

find . -name "*ABC*" | grep -R 'XYZ'

그러나 올바른 출력을 제공하지 않습니다.

답변:


26

grep표준 입력에서 검색 할 파일 이름을 읽을 수 없기 때문 입니다. 당신이하고있는 일은 포함 된 파일 이름 을 인쇄하는 것입니다 XYZ. 대신 find-exec옵션을 사용하십시오 .

find . -name "*ABC*" -exec grep -H 'XYZ' {} +

보낸 사람 man find:

   -exec command ;
          Execute  command;  true  if 0 status is returned.  All following
          arguments to find are taken to be arguments to the command until
          an  argument  consisting of `;' is encountered.  The string `{}'
          is replaced by the current file name being processed  everywhere
          it occurs in the arguments to the command, not just in arguments
          where it is alone, as in some versions of find. 

[...]

   -exec command {} +
          This  variant  of the -exec action runs the specified command on
          the selected files, but the command line is built  by  appending
          each  selected file name at the end; the total number of invoca‐
          tions of the command will  be  much  less  than  the  number  of
          matched  files.   The command line is built in much the same way
          that xargs builds its command lines.  Only one instance of  `{}'
          is  allowed  within the command.  The command is executed in the
          starting directory.

실제 일치하는 줄이 필요하지 않고 하나 이상의 문자열이 포함 된 파일 이름 목록 만 필요한 경우이를 대신 사용하십시오.

find . -name "*ABC*" -exec grep -l 'XYZ' {} +

2

가장 간단한 방법으로 다음 명령을 찾습니다.

grep -R --include="*ABC*" XYZ

또는 -i대소 문자를 구분하지 않고 검색에 추가하십시오 .

grep -i -R --include="*ABC*" XYZ

1

… | grep -R 'XYZ'말도 안 돼. 한편으로 디렉토리 -R 'XYZ'에서 재귀 적으로 행동하는 것을 의미합니다 XYZ. 반면 '의 표준 입력 에서 … | grep 'XYZ'패턴을 찾는 것을 의미합니다 . \XYZgrep

맥 OS X 또는 BSD에서 grep처리합니다XYZ 패턴으로 하여 다음과 같이 불평합니다.

$ echo XYZ | grep -R 'XYZ'
grep: warning: recursive search of stdin
(standard input):XYZ

GNU grep는 불평하지 않습니다. 오히려, 그것은 취급XYZ 패턴으로 하고 표준 입력을 무시하고 현재 디렉토리에서 시작하여 재귀 적으로 검색합니다.


당신이하려는 것은 아마

find . -name "*ABC*" | xargs grep -l 'XYZ'

… 어떤

grep -l 'XYZ' $(find . -name "*ABC*")

… 둘 다 말해 grep 찾아 보라고한다XYZ 일치하는 파일 이름 .

그러나 파일 이름에 공백이 있으면이 두 명령이 중단됩니다. 구분 기호 xargs로 사용하여 안전하게 사용할 수 있습니다 NUL.

find . -name "*ABC*" -print0 | xargs -0 grep -l 'XYZ'

그러나 @terdon의 솔루션을 사용하는 find … -exec grep -l 'XYZ' '{}' +것이 더 간단하고 좋습니다.


-1

Linux Commend : ll -iR | grep "파일 이름"

예 : Bookname.txt 다음에 ll -iR | grep "Bookname"또는 ll -iR | grep "이름"또는 ll -iR | grep "도서"

파일 이름의 일부로 검색 할 수 있습니다.

현재 및 하위 폴더에서 일치하는 모든 파일 이름이 나열됩니다.


이것은 질문의 "파일 내부 검색"부분을 다루지 않기 때문에 부분적인 대답 일뿐입니다. 파일 이름 globbing 패턴을 사용하는 것이 훨씬 더 효율적 find입니다.
Kusalananda
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.