다음 명령을 사용하여 많은 파일을 복사하고 싶습니다.
cp `find /Volumes/DATA/ -name "*.app" -depth 1 2> /dev/null` /Volumes/VMWare/img/
그러나 이것은 공백을 발견하면 순서의 끝으로 해석하기 때문에 작동하지 않습니다.
이 문제를 어떻게 해결하나요?
답변1
먼저, find는 그 결과로 무엇인가를 할 수 있습니다 -exec {}
. 다음을 수행할 수 있습니다.
find /Volumes/DATA/ -name "*.app" -depth 1 2> /dev/null -exec cp '{}' /Volumes/VMWare/img/ \;
파일 자리 표시자 "{}" 주위에 작은따옴표가 있는지 확인하세요.
xargs와 함께 파이프를 사용할 수도 있습니다.
답변2
에서 현대 형식과 마찬가지로 zsh
분할 은 기본적으로 SPC, TAB, NL 및 NUL을 포함하는 문자를 기반으로 합니다 .`...`
$(...)
$IFS
이 중 NUL만 파일 경로에 나타날 수 없으므로 다음이 필요합니다.
IFS=$'\0'
cp $(find /Volumes/DATA/ -name "*.app" -depth 1 -print0 2> /dev/null) /Volumes/VMWare/img/
$(...)
또는 전역 매개변수를 통해 수행된 암시적 토큰화를 사용하는 대신 명시적인 분할 연산자를 사용하세요.
cp ${(0)"$(find /Volumes/DATA/ -name "*.app" -depth 1 -print0 2> /dev/null)"} /Volumes/VMWare/img/
그러나 어쨌든 find
여기서는 이를 사용해도 아무런 이점이 없습니다.
cp /Volumes/DATA/*.app(D) /Volumes/VMWare/img/
(여기서 glob 한정자가 사용되므로 숨김 파일 D
도 find
포함됩니다. 어쨌든 건너뛰고 싶을 수도 있습니다).
답변3
파일 이름을 널로 종료하려면 -print0
with를 사용 하고 표준 입력의 파일 이름이 널로 종료됨을 나타내려면 이 출력을 with에 제공하십시오. 그리고 초기 매개변수의 문자열을 대체하는 데 사용됩니다.find
xargs
-0
xargs
-I
find /Volumes/DATA/ -name '*.app' -maxdepth 1 -print0 | xargs -0 -I fn cp fn /Volumes/VMWare/img/