답변:
시험:
find src/ -type f | grep -i so$ | xargs -i cp {} dst
grep사용 된 간단한 쉘 패턴보다 훨씬 큽니다 . 또한 매개 변수 보다 훨씬 강력 합니다 . -namefindxargs-execfind
Mike가 제안한 명령을 시도했습니다.
find src/ -type f | grep -i so$ | xargs -i cp {} dst
그러나 결국 모든 파일을 디렉토리로 덤프했습니다. dst 상대 경로가 손실 된 .
상대 경로를 유지하려면 명령을 다음과 같이 수정해야합니다.
find src/ -type f | grep -i so$ | xargs -i cp {} dst/{}
dst. 그렇지 않은 경우을 사용하십시오 cp --parents. 또한 파일 이름을 인용하십시오. 따라서 : ... | xargs -i cp --parents "{}" dst(마지막 인수 cp는 이제 대상 디렉토리 일뿐입니다). -t플래그를 사용하면 명령을 더 짧게 (아마도 더 빠르게) 수행 할 수 있습니다 ... | xargs cp --parents -t dst.
... | xargs cp {} --parents -t dst.
--parents는 사용할 수 없습니다. ditto대신 사용 했습니다 : stackoverflow.com/questions/11246070/cp-parents-option-on-mac
이 작업을 수행하는 다른 방법은 다음과 같습니다.
find src/ -type f -name "*.so" -exec cp {} dst/ \;
cp프로세스 수를 줄여야 ... -exec cp -t dst/ {} +합니다.
-exec와 ;, {}한 번에 하나 개의 경로로 대체됩니다. cp모든 파일에 대해 별도의 정보 를 얻습니다 . 와 +구문 find을 대체 {}여러 결과 (명령 행 길이의 시스템 정의 한계까지, 제한 : {}전에 마지막이어야 +따라서 cp -t). 프로세스를 생성하고 종료하는 것은 상대적으로 비용이 많이 듭니다. +따라서 많은 결과를 기대할 때마다 사용하는 것이 좋습니다 . 이 경우 많은 파일을 복사하면 어쨌든 많은 시간이 걸리므로 차이가 눈에 띄지 않게 될 수 있습니다. 그럼에도 불구하고 좋은 습관입니다.
find패턴 매칭을 수행하고 명령을 실행할 수 있습니다. 출력을 파이프 할 필요는 없습니다 :find src/ -type f -name '*.so' -exec cp '{}' dst/ ';'