find
문자열을 검색할 때 파일 이름과 줄 번호를 어떻게 반환합니까 ? 한 명령에서는 파일 이름을 반환하고 다른 명령에서는 줄 번호를 반환했지만 이를 결합할 수 없는 것 같습니다.
파일 이름:find . -type f -exec grep -l 'string to search' {} \;
줄 번호:find . -type f -exec grep -n 'string to search' {} \;
답변1
답변2
비표준 -H
또는 -r
/ -R
옵션을 사용하지 않는 한 grep
파일 이름은 여러 파일 이름이 전달될 때만 출력되므로 다음 을 수행할 수 있습니다.
find . -type f -exec grep -n 'string to search' /dev/null {} +
{} +
구문을 사용 하면 find
필요한 만큼 많은 파일을 전달하는 grep
반면, 을 사용하면 각 파일에 대해 하나씩 {} ';'
실행하므로 grep
매우 비효율적입니다.
/dev/null
우리는 최소한 두 개의 파일을 얻기 위해 추가 (존재하고 비어 있음을 보장)합니다 grep
. 이는 현재 디렉터리나 아래 디렉터리에 일반 파일이 하나만 있거나 파일 목록이 find
다음과 같이 분할 된 경우에 적합합니다. 마지막 실행에는 파일이 하나만 있었던 방식입니다.
참고로, 다음과 같은 -exec grep regex {} +
경우 find
의 종료 상태는 0이 아닙니다 .어느grep
0이 아닌 종료 상태로 종료되는 통화입니다. find
특정 디렉터리를 탐색/읽을 수 없거나 파일 메타데이터를 얻을 수 없는 경우 에도 0이 아닙니다. find
반환된 종료 상태가 0이면 모든 find
디렉터리를 탐색할 수 있고모두 grep
호출이 성공하지만(최소 하나의 일치 항목이 있는 하나 이상의 파일이 발견됨) 0이 아닌 값을 반환한다고 해서 반드시 일치 항목이 발견되지 않았다는 의미는 아닙니다.
의 종료 상태는 -exec grep regex {} ';'
조건 자(조건으로 사용할 수 있음)가 성공했는지 여부를 확인하는 데만 사용되며 의 종료 상태에는 반영되지 않습니다. so 의 종료 상태 는 모든 파일을 찾을 수 있는지 여부에만 관련됩니다.grep
-exec
find
find
답변3
grep이 재귀 -r
플래그를 지원하는 경우 요청이 해결될 수 있습니다.
grep -rn "String to search " *