[linux] xargs를 사용하여 이름에 공백과 따옴표가있는 파일을 복사하려면 어떻게해야합니까?

디렉토리 아래에 많은 파일을 복사하려고하는데 많은 파일 이름에 공백과 작은 따옴표가 있습니다. findgrep함께 문자열을 시도 xargs하면 다음 오류가 발생합니다.

find .|grep "FooBar"|xargs -I{} cp "{}" ~/foo/bar
xargs: unterminated quote

보다 강력한 xargs 사용법에 대한 제안 사항이 있습니까?

이것은 BSD와 Mac OS X 10.5.3 (Leopard)에 xargs있습니다.



답변

이 모든 것을 하나의 find명령 으로 결합 할 수 있습니다 .

find . -iname "*foobar*" -exec cp -- "{}" ~/foo/bar \;

공백이있는 파일 이름과 디렉토리를 처리합니다. -name대소 문자를 구분하여 결과를 얻을 수 있습니다 .

참고 : --플래그가 옵션으로 cp시작하는 파일을 처리하지 못하도록 전달되었습니다 -.


답변

find . -print0 | grep --null 'FooBar' | xargs -0 ...

나는 여부를 모르는 grep지원 --null,도 여부를 xargs지원 -0, 레오파드,하지만 GNU에 모두 좋다.


답변

원래 포스터가 원하는 것을 수행하는 가장 쉬운 방법은 구분 기호를 공백에서 다음과 같이 줄 끝 문자로 변경하는 것입니다.

find whatever ... | xargs -d "\n" cp -t /var/tmp


답변

“cp”를 여러 번 실행하지 않으므로보다 효율적입니다.

find -name '*FooBar*' -print0 | xargs -0 cp -t ~/foo/bar


답변

나는 같은 문제에 부딪쳤다. 내가 해결 한 방법은 다음과 같습니다.

find . -name '*FoooBar*' | sed 's/.*/"&"/' | xargs cp ~/foo/bar

내가 사용하는 sed같은 라인 입력의 각 라인을 대체하는 것이 아니라 큰 따옴표로 둘러싸여 있습니다. 로부터 sedman 페이지, ” … 앰퍼샌드 (“& ”) 교체에 나타나는은 RE를 … 일치하는 문자열로 대체 이 경우, -” .*전체 라인.

이것은 xargs: unterminated quote오류를 해결합니다 .


답변

이 방법은 Mac OS X v10.7.5 (Lion)에서 작동합니다.

find . | grep FooBar | xargs -I{} cp {} ~/foo/bar

또한 게시 한 정확한 구문을 테스트했습니다. 10.7.5에서도 잘 작동했습니다.


답변

그냥 사용하지 마십시오 xargs. 깔끔한 프로그램이지만 잘 어울리지 않습니다.find 사소한 경우 어울리지 .

여기에 휴대용 (POSIX) 솔루션, 즉 필요로하지 않는 하나 find, xargs또는 cpGNU의 특정 확장 :

find . -name "*FooBar*" -exec sh -c 'cp -- "$@" ~/foo/bar' sh {} +

+더 평소 대신 결말에 주목하십시오.; .

이 솔루션 :

  • 공백, 개행 또는 이국적인 문자가 포함 된 파일 및 디렉토리를 올바르게 처리합니다.

  • GNU 툴킷을 제공하지 않는 유닉스 및 리눅스 시스템에서도 작동합니다.

  • xargs훌륭하고 유용한 프로그램을 사용하지 않지만 find출력 을 올바르게 처리하기 위해서는 너무 많은 조정 및 비표준 기능이 필요 합니다.

  • 또한 허용되는 것보다 더 효율적 이며 ( 빠른 읽기 ) 다른 답변 모두는 아닙니다.

또한 다른 답변이나 의견에 언급 된 내용에도 불구하고 인용문 {}은 쓸모가 없습니다 (이국적인 fish껍질을 사용하지 않는 한 ).