
안녕하세요. 예를 들어, 저는 디렉터리와 모든 하위 디렉터리를 반복하여 모든 파일에서 문자열 'foo'를 찾으려고 합니다. 그런 다음 해당 파일이 포함된 모든 파일의 파일 이름(전체 경로 포함)을 표시하고 싶습니다.
운영 체제는 Unix이며 bash 쉘을 사용합니다.
어떤 제안이라도 감사하겠습니다. 감사해요
답변1
재귀적 을 사용할 수 있습니다 grep
. GNU에서는 grep
적어도 다음과 같은 -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
나는 이 유틸리티가 당신이 찾고 있는 일을 정확하게 해낼 것이라고 믿습니다 . 시스템에 이미 설치되어 있을 수 있습니다. 그렇지 않은 경우 다음에서 다운로드할 수 있습니다.https://beyondgrep.com/.
의 좋은 기능 중 하나 는 기본적으로 바이너리 파일을 무시하고 명령줄 옵션을 제공하여 미리 정의된 필터나 파일 유형(예: 프로그래밍 언어로 검색할 파일 , 파일 , ack
파일 유형)을 기준으로 검색되는 파일 유형을 제한 할 수 있다는 것입니다 . 첫 번째 줄에서 일치하는 파일을 검색하세요 .) 이러한 유형은 사용자가 명령줄에서 확장하거나 파일에서 더 영구적으로 확장할 수도 있습니다 .--type=cc
.c
.h
.xs
--type=awk
/awk/
~/.ackrc