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

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

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

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

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

답변1

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

답변3

… | grep -R 'XYZ'무의미한. 한편으로는 디렉토리 에 대해 -R 'XYZ'재귀적으로 작업하는 것을 의미합니다. XYZ반면에 는 표준 입력에서 패턴을 찾는 것을 의미합니다 … | grep 'XYZ'. \XYZgrep

Mac 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' '{}' +더 간단하고 더 좋습니다.

답변4

Linux 권장 사항: ll -iR grep "filename"

예: Bookname.txt 그런 다음 ll -iR | grep "bookname" 또는 ll -iR | grep "name" 또는 ll -iR |

파일 이름의 일부를 사용하여 검색할 수 있습니다.

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

관련 정보