find : -exec vs xargs (일명“find | xargs basename”이 깨지는 이유는 무엇입니까?) `./pool/main/a/aalib/libaa1_1.4p5-37+b1_i386.deb’ Try `basename –help’ for more information. 다음

하위 디렉토리에 퍼져있는 특정 유형의 모든 파일을 찾으려고 노력했으며 내 목적으로는 파일 이름 만 필요했습니다. 를 통해 경로 구성 요소를 제거하려고 시도했지만 basename작동하지 않았습니다 xargs.

$ find . -name '*.deb' -print | xargs basename
basename: extra operand `./pool/main/a/aalib/libaa1_1.4p5-37+b1_i386.deb'
Try `basename --help' for more information.

다음 변형 중 하나에 대해 동일한 내용 (정확히 동일한 오류)을 얻습니다.

$ find . -name '*.deb' -print0 | xargs -0 basename
$ find . -name '*.deb' -print | xargs basename {}

반면에 이것은 예상대로 작동합니다.

$ find . -name '*.deb' -exec basename {} \;
foo
bar
baz

이것은 최신 Cygwin 및 Debian 5.0.3에서 발생합니다. 내 진단은 xargs가 어떤 이유로 든 두 개의 입력 줄을 기본 이름으로 전달하는 이유는 무엇입니까? 무슨 일이야?



답변

basenameLOTS가 아닌 하나의 매개 변수 만 원 하기 때문 입니다. 그리고 xargs많은 매개 변수를 만듭니다.

실제 문제를 해결하려면 (파일 이름 만 나열) :

 find . -name '*.deb' -printf "%f\n"

‘basename'(man find) 만 인쇄합니다.

 %f     File's name with any leading directories
        removed (only the last element).

답변

이 시도:

find . -name '*.deb' | xargs -n1 basename

답변

basename은 단일 인수 만 허용합니다. -exec{}파일은 현재 처리중인 파일 이름으로 바뀌고 명령은 모든 인수를 한 번에 basename으로 보내지 않고 일치하는 파일 당 한 번 실행 되므로 올바르게 사용 됩니다.


답변

xargs 하나의 인수 만 전달하도록 강요받을 수 있습니다 …


find . -name '*.deb' -print | xargs -n1 basename

이것은 작동하지만 허용되는 답변 find이보다 적절한 방식으로 사용 중입니다. xargs basename파일 위치 목록을 얻기 위해 다른 명령을 사용 하면서이 질문에서 문제를 검색하는 것을 발견했습니다 . 의 -n1깃발은 xargs저에게 최고의 해답이었습니다.