안녕하세요, 예를 들어, 저는 모든 파일에서 문자열 "foo"를 찾기 위해 디렉토리와 모든 하위 디렉토리를 반복하려고 합니다. 그런 다음 해당 파일이 포함된 모든 파일의 파일 이름(전체 경로 포함)을 표시하고 싶습니다.
운영 체제는 Unix이며 bash 쉘을 사용합니다.
어떤 제안이라도 대단히 감사하겠습니다. 감사해요
답변1
재귀를 사용할 수 있습니다 grep
. grep
적어도 GNU에서는 이것이 -R
옵션입니다:
grep -R foo /path/to/parent/directory
예를 들어, 위에 표시된 것처럼 전체 경로를 사용하면 /home/callsign223/foo/
모든 파일에 정규화된 경로가 표시됩니다. 일치하는 줄이 아닌 파일 이름만 보려면 -l
파일 이름만 인쇄하면 됩니다.
grep -lR foo /path/to/parent/directory
이 옵션은 이식 가능하지 않으며 -R
모든 구현에서 지원되지는 않습니다.grep
답변2
이것이 옵션이 아닌 경우 grep -R
다음을 사용하여 각 파일에서 실행할 수 있습니다 find
.grep
find ./ -type f -exec grep -Hni "some-string" {} ';'
답변3
현재 모든 Unix 시스템에서 작동하는 방법은 find
파일 찾기를 사용한 다음 grep
문자열이 포함된 파일을 식별하는 것 입니다 foo
.
find . -type f -exec grep -l -F -e 'foo' {} +
위 명령은 현재 디렉토리 안이나 아래의 모든 일반 파일을 찾습니다. 일괄적으로 발견된 파일의 경우 grep
문자열을 찾기 위해 호출이 이루어집니다 foo
. 파일에서 문자열을 찾을 때 grep
파일의 경로명을 즉시 출력하고 현재 파일을 더 이상 읽지 않고 다음 파일을 계속해서 출력합니다.
- 우리는 이를 사용하여 주어진 패턴과 일치하는 첫 번째 줄의 파일 이름을
-l
중지 하고 보고합니다.grep
이렇게 하면 첫 번째 적중 이후 파일 비트를 무시하여 처리 속도를 높일 수 있습니다. - 우리는 일반적 으로 패턴을 정규 표현식이 아닌 문자열로
-F
생각합니다 .grep
이렇게 하면 정규식 일치를 시도하지 않음으로써 작업 속도가 빨라지고 정규식처럼 보이는 문자열을 일치시킬 수 있습니다. -e
대시로 시작하는 경우를 대비해 주어진 패턴을 사용합니다 . 이 경우에는 그렇게 하지 않지만foo
해당 정적 문자열을 변수로 바꾸면 대시로 시작하는 패턴과 일치할 가능성이 있으므로 이는 명령줄 옵션으로 오인됩니다.
그러나 파일 이름 목록은 일반적으로 별 이점이 없습니다. 이러한 파일에 대해 특정 작업을 수행할 수 있습니다. 그렇다면 다음을 find
통해 유틸리티 프로그램의 일부로 실행할 수 있습니다 -exec
.
find . -type f -exec sh -c '
for pathname do
grep -q -F -e "foo" "$pathname" || continue
# Do something with "$pathname" here
done' sh {} +
여기서는 발견된 파일을 일괄 처리하기 위해 짧은 인라인 스크립트를 호출합니다. 우리는 각 파일의 문자열을 개별적으로 확인 foo
하고 해당 문자열을 포함하지 않는 파일을 무시합니다. 귀하가 처리할 인라인 스크립트에 주석을 추가했습니다 "$pathname"
.
인라인 스크립트를 호출하기 전에 find
위 코드를 별도로 실행할 수도 있습니다.grep
find . -type f -exec grep -q -F -e 'foo' {} \; -exec sh -c '
for pathname do
# Do something with "$pathname" here
done' sh {} +
테스트를 통과한 파일을 호출하기 전에 첫 번째 파일이 -exec
현재 파일을 테스트하는 방법에 주목하세요.sh -c
답변4
나는 이 유틸리티가 귀하의 요구를 완벽하게 충족시킬 것이라고 믿습니다 ack
. 시스템에 이미 설치되어 있을 수 있습니다. 그렇지 않은 경우 다음 URL에서 다운로드할 수 있습니다.https://beyondgrep.com/.
의 좋은 기능 ack
은 기본적으로 이진 파일을 무시하고 명령줄 옵션을 제공하여 지정된 필터 또는 파일 유형으로 검색되는 파일 유형을 제한할 수 있다는 것입니다(예: 프로그래밍 언어: , , 파일을 --type=cc
검색 .c
하고 일치하는 모든 파일을 검색합니다). 첫 번째 줄에). 사용자는 명령줄에서 또는 파일에서 더 영구적으로 이러한 유형을 확장할 수도 있습니다..h
.xs
--type=awk
/awk/
~/.ackrc