find ... -exec grep을 사용하여 파일 이름과 줄 번호를 반환하는 방법은 무엇입니까?

find ... -exec grep을 사용하여 파일 이름과 줄 번호를 반환하는 방법은 무엇입니까?

find문자열을 검색할 때 파일 이름과 줄 번호를 어떻게 반환합니까 ? 한 명령에서는 파일 이름을 반환하고 다른 명령에서는 줄 번호를 반환했지만 이를 결합할 수 없는 것 같습니다.

파일 이름:find . -type f -exec grep -l 'string to search' {} \;

줄 번호:find . -type f -exec grep -n 'string to search' {} \;

답변1

명령줄 스위치는 파일이 하나만 있는 경우에도 파일 이름을 강제로 -H인쇄합니다 .grep

% grep -n 7 test.in
7:7
% grep -Hn 7 test.in
test.in:7:7

   -H, --with-filename
          Print the filename for each match.

다음과 같이 참고하시기 바랍니다고지로에서 말했다코멘트, 이는 POSIX 표준의 일부가 아니며 GNU 및 BSD grep 모두에 존재하지만 일부 시스템(예: Solaris)에는 포함되지 않을 수 있습니다.

답변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이 아닙니다 .어느grep0이 아닌 종료 상태로 종료되는 통화입니다. find특정 디렉터리를 탐색/읽을 수 없거나 파일 메타데이터를 얻을 수 없는 경우 에도 0이 아닙니다. find반환된 종료 상태가 0이면 모든 find디렉터리를 탐색할 수 있고모두 grep호출이 성공하지만(최소 하나의 일치 항목이 있는 하나 이상의 파일이 발견됨) 0이 아닌 값을 반환한다고 해서 반드시 일치 항목이 발견되지 않았다는 의미는 아닙니다.

의 종료 상태는 -exec grep regex {} ';'조건 자(조건으로 사용할 수 있음)가 성공했는지 여부를 확인하는 데만 사용되며 의 종료 상태에는 반영되지 않습니다. so 의 종료 상태 는 모든 파일을 찾을 수 있는지 여부에만 관련됩니다.grep-execfindfind

답변3

grep이 재귀 -r플래그를 지원하는 경우 요청이 해결될 수 있습니다.

grep -rn "String to search " * 

관련 정보