find 명령 경로의 공백 수정

find 명령 경로의 공백 수정

다음 명령을 사용하여 많은 파일을 복사하고 싶습니다.

 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 한정자가 사용되므로 숨김 파일 Dfind포함됩니다. 어쨌든 건너뛰고 싶을 수도 있습니다).

답변3

파일 이름을 널로 종료하려면 -print0with를 사용 하고 표준 입력의 파일 이름이 널로 종료됨을 나타내려면 이 출력을 with에 제공하십시오. 그리고 초기 매개변수의 문자열을 대체하는 데 사용됩니다.findxargs-0xargs-I

find /Volumes/DATA/ -name '*.app' -maxdepth 1 -print0 | xargs -0 -I fn cp fn /Volumes/VMWare/img/

관련 정보