디렉토리 아래에 많은 파일을 복사하려고하는데 많은 파일 이름에 공백과 작은 따옴표가 있습니다. find
와 grep
함께 문자열을 시도 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
같은 라인 입력의 각 라인을 대체하는 것이 아니라 큰 따옴표로 둘러싸여 있습니다. 로부터 sed
man 페이지, ” … 앰퍼샌드 (“& ”) 교체에 나타나는은 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
또는 cp
GNU의 특정 확장 :
find . -name "*FooBar*" -exec sh -c 'cp -- "$@" ~/foo/bar' sh {} +
+
더 평소 대신 결말에 주목하십시오.;
.
이 솔루션 :
-
공백, 개행 또는 이국적인 문자가 포함 된 파일 및 디렉토리를 올바르게 처리합니다.
-
GNU 툴킷을 제공하지 않는 유닉스 및 리눅스 시스템에서도 작동합니다.
-
xargs
훌륭하고 유용한 프로그램을 사용하지 않지만find
출력 을 올바르게 처리하기 위해서는 너무 많은 조정 및 비표준 기능이 필요 합니다. -
또한 허용되는 것보다 더 효율적 이며 ( 빠른 읽기 ) 다른 답변 모두는 아닙니다.
또한 다른 답변이나 의견에 언급 된 내용에도 불구하고 인용문 {}
은 쓸모가 없습니다 (이국적인 fish
껍질을 사용하지 않는 한 ).