[linux] find -exec cmd {} + vs | xargs

매우 큰 파일 세트보다 더 효율적이며 사용해야하는 것은 무엇입니까?

find . -exec cmd {} +

또는

find . | xargs cmd

(파일 이름에 재미있는 문자가 없다고 가정)



답변

속도 차이는 미미합니다.

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

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

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

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

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

또는

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

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


답변

find . | xargs cmd

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

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

find . -print0 | xargs -0 cmd

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


답변

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

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


답변