파일 이름에 "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'
. \XYZ
grep
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 |
파일 이름의 일부를 사용하여 검색할 수 있습니다.
현재 폴더와 하위 폴더에서 일치하는 모든 파일 이름이 나열됩니다.