찾기 결과에 xargs를 사용할 때 파일 이름의 공백을 어떻게 처리 할 수 ​​있습니까?


28

나의 일반적인 관행 중 하나는 특정 유형의 모든 파일에 대해 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? 아니면 완전히 다른 명령을 사용해야합니까?

답변:


29

용도

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.

15

당신은 사용할 필요가 없습니다 xargs를을 하기 때문에 발견이 명령 자체를 실행할 수 있습니다. 이 작업을 수행 할 때 이름의 쉘 해석 문자에 대해 걱정할 필요가 없습니다.

find /path/to -name "*.html" -exec grep -l "rumpus" '{}' +

찾기 맨 페이지에서

-exec 명령 {} +
-exec 조치의이 변형은 선택된 파일에서 지정된 명령을 실행하지만 명령 행은 선택한 각 파일 이름을 끝에 추가하여 빌드됩니다. 명령의 총 호출 수는 일치하는 파일 수보다 훨씬 적습니다. 명령 행은 xargs가 명령 행을 빌드하는 것과 거의 같은 방식으로 빌드됩니다. `{} '인스턴스는 하나만 허용됩니다. 명령은 시작 디렉토리에서 실행됩니다.


나는 이것을 공언하지만 오늘은 남지 않았다-나는 내일 할 것이다.
user9517은 GoFundMonica 지원

1
@Iain-거기 당신은 간다 (나는 동의한다).
Eduardo Ivanec

find를 사용하면 여전히 xargs의 기능을 놓칠 수 있으며 어리석은 인용 규칙을 처리해야합니다. 코어 / CPU가 둘 이상인 경우 xargs에 대한 -P 인수를 참조하십시오.
Slartibartfast

8

시스템에 발견하고 xarg 버전을 지원하지 않는 경우 -print0-0(예를 들어, AIX의 발견 및 xargs를위한) 스위치 당신은이를 사용할 수 있습니다 :

find /your/path -name "*.html" | sed 's/ /\\ /g' | xargs grep -l "rumpus"

여기에서 sed는 xargs를위한 공간을 벗어날 것입니다.


여러 번 사용한 파일을 만들기 어려운 파일 이름 목록이 많았 기 때문에 도움이되었습니다. 난 그냥 find다시 갈 수 없어
Scott M.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.