find -exec cmd {} + vs | xargs


답변:


107

속도 차이는 미미합니다.

그러나 다음 사항을 확인해야합니다.

  1. 스크립트는 파일 이름에 공백, 탭 등이없는 파일이라고 가정하지 않습니다. 첫 번째 버전은 안전하고 두 번째 버전은 안전하지 않습니다.

  2. 스크립트는 " -"로 시작하는 파일을 옵션으로 취급하지 않습니다 .

따라서 코드는 다음과 같아야합니다.

find . -exec cmd -option1 -option2 -- {} +

또는

find . -print0 | xargs -0 cmd -option1 -option2 --

첫 번째 버전은 1을 무시할 수 있으므로 더 짧고 작성하기 쉽습니다. 그러나 " -exec cmd {} +"는 GNU findutils에서 비교적 새로운 옵션이기 때문에 두 번째 버전은 더 이식 가능하고 안전합니다 (2005 년부터 실행중인 많은 시스템에는 아직이 옵션이 없습니다). 최근에는 버그많았습니다 . 또한 많은 사람들이 -exec cmd {} +다른 답변에서 볼 수 있듯이이 " "를 모릅니다 .


4
-print0은 또한 많은 비 Linux 시스템에서 누락 된 GNU 찾기 (및 GNU xargs) 옵션이므로 이식성 인수가 유효하지 않습니다. 그러나 -print 만 사용하고 xargs에서 -0을 제외하는 것은 이식성 매우 뛰어납니다.
dannysauer

7
요점은 -print0 없이는 공백이나 탭 등이있는 파일이 있으면 작동하지 않는다는 것입니다. 이것은 "foo -o index.html"과 같은 파일 이름이있는 것처럼 보안 취약점이 될 수 있습니다. 그러면 -o가 처리됩니다. 옵션으로. 빈 디렉토리에서 시도하십시오 : "touch-foo \ -o \ index.html; find. | xargs cat". "cat : invalid
option-

2
그의 예는-가 포함 된 파일 이름입니다. -print0이 없으면 find가 ./foo -o index.html을 뱉어냅니다. 따라서-로 시작하는 것은 큰 문제는 아니지만 결과는 거의 변경되지 않으며 다중 사용자 시스템에서 스크립트가 세계적으로 읽을 수있는 경우 공격 벡터를 제공 할 수 있습니다.
bobpaul 2012

2
여기에서 나를 괴롭힌 것에 대한 메모 exec-using은 찾은 결과를 출력 xargs하고 stdout에 쓰기 전에 전체 디렉토리가 검색 될 때까지 기다립니다. 큰 디렉토리에서이 작업을 시도하고 있는데 xargs작동하지 않는 것 같으면 인내심이 좋습니다.
FarmerGedden 2013 년

1
@Motivated Without -print0find는 개행으로 구분 된 파일 이름을 반환하지만 개행은 파일 이름의 일부가되어 모호하게 만들 수도 있습니다. 바이트 0은 할 수 없으므로 안전한 구분 기호입니다. 예- --항상 엄격하게 요구되거나 안전하지 않은 경우에도 인수를 제어 할 수없는 경우이를 지원하는 명령에 추가 하는 것이 좋습니다.
Tometzky

7
find . | xargs cmd

더 효율적입니다 ( 매 경기마다 한 번씩 실행 cmd되는와 달리 가능한 한 적게 실행 됨 ). 그러나 파일 이름에 공백이나 펑키 문자가 포함되어 있으면 문제가 발생합니다.execcmd

다음을 사용하는 것이 좋습니다.

find . -print0 | xargs -0 cmd

이 파일 이름은 펑키 문자가 포함 된 경우에도 작동합니다 ( -print0차종은 find, NUL 종료 일치를 인쇄 -0차종이 xargs이 형식을 기대합니다.)


28
이것은 "find. -exec cmd {} \;"가 아닙니다. 그러나 "find. -exec cmd {} +". 후자는 한 번에 하나의 파일을 실행하지 않습니다.
Tometzky

2
주의 xargs가 더 (또는 몇) 일치하는 파일이없는 및 경우 접근 방식이 상당히 느린 실제로 cmd각 파일에 대해 할 일이 많이 없습니다. 예를 들어, 빈 디렉토리에서 실행하면 xargs하나가 아닌 두 개의 프로세스를 시작해야하므로 버전은 최소한 두 배의 시간이 걸립니다. (예, 차이는 일반적으로 * nix에서 감지 할 수 없지만 루프에서 중요 할 수 있습니다. 또는 Windows에서 잠시 시도해보십시오 ...)
SamB

2

Modern xargs버전은 종종 병렬 파이프 라인 실행을 지원합니다.

분명히 그것은 사이의 선택 find … -exec 과 관련 하여 피벗 포인트가 될 수 있습니다. … | xargs

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.