나의 일반적인 관행 중 하나는 특정 유형의 모든 파일에 대해 grep을 수행하는 것입니다. 예를 들어 “rumpus”라는 단어가 포함 된 모든 HTML 파일을 찾으십시오. 그것을하기 위해, 나는
find /path/to -name "*.html" | xargs grep -l "rumpus"
간혹 find
이름과 같이 이름이 공백 인 파일을 반환합니다 my new file.html
. 때 xargs
이 전달 grep
하지만, 나는 이러한 오류를 얻을 :
grep: /path/to/bad/file/my: No such file or directory
grep: new: No such file or directory
grep: file.html: No such file or directory
여기서 무슨 일이 일어나고 있는지 알 수 있습니다 : 파이프 또는 xargs
은 공백을 파일 사이의 구분자로 취급합니다. 그러나 내 인생에서는이 행동을 막는 방법을 알 수 없습니다. find
+로 할 수 있습니까 xargs
? 아니면 완전히 다른 명령을 사용해야합니까?
답변
용도
find ... -print0 | xargs -0 ...
예 :
find /path/to -name "*.html" -print0 | xargs -0 grep -l "rumpus"
찾기 맨 페이지에서
-print0
True; print the full file name on the standard output, followed
by a null character (instead of the newline character that
‘-print’ uses). This allows file names that contain newlines or
other types of white space to be correctly interpreted by pro-
grams that process the find output. This option corresponds to
the ‘-0’ option of xargs.
답변
당신은 사용할 필요가 없습니다 xargs를을 하기 때문에 발견이 명령 자체를 실행할 수 있습니다. 이 작업을 수행 할 때 이름의 쉘 해석 문자에 대해 걱정할 필요가 없습니다.
find /path/to -name "*.html" -exec grep -l "rumpus" '{}' +
찾기 맨 페이지에서
-exec 명령 {} +
-exec 조치의이 변형은 선택된 파일에서 지정된 명령을 실행하지만 명령 행은 선택한 각 파일 이름을 끝에 추가하여 빌드됩니다. 명령의 총 호출 수는 일치하는 파일 수보다 훨씬 적습니다. 명령 행은 xargs가 명령 행을 빌드하는 것과 거의 같은 방식으로 빌드됩니다. `{} ‘인스턴스는 하나만 허용됩니다. 명령은 시작 디렉토리에서 실행됩니다.
답변
시스템에 발견하고 xarg 버전을 지원하지 않는 경우 -print0
와 -0
(예를 들어, AIX의 발견 및 xargs를위한) 스위치 당신은이를 사용할 수 있습니다 :
find /your/path -name "*.html" | sed 's/ /\\ /g' | xargs grep -l "rumpus"
여기에서 sed는 xargs를위한 공간을 벗어날 것입니다.