find : -exec vs xargs (일명“find | xargs basename”이 깨지는 이유는 무엇입니까?)


10

하위 디렉토리에 퍼져있는 특정 유형의 모든 파일을 찾으려고 노력했으며 내 목적으로는 파일 이름 만 필요했습니다. 를 통해 경로 구성 요소를 제거하려고 시도했지만 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가 어떤 이유로 든 두 개의 입력 줄을 기본 이름으로 전달하는 이유는 무엇입니까? 무슨 일이야?

답변:


23

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

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

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

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

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

1
우 ... / 다시 이마를 때려은 / 내가 ...는 "찾을 인형을위한"책을 필요가 있다고 생각
키호테 돌팔이 의사

요점은 xargs그것이 인수 목록을 작성하고 그 뒤에 오는 명령에 각각을 공급한다는 것입니다. 그렇지 않으면 그 차이점은 무엇 find . -name '*.deb' | basename입니까?
WindowsMaker

GNU 기본 이름에는 -a"여러 인수를 지원하고 각각을 이름으로 취급"옵션이 있습니다.
감독

1
@WindowsMaker xargsstdin명령 인수 로 변환 합니다. 어떤 식으로, 반대의 경우 echo, 인수를로 변환합니다 stdout. 차이 find ... | xargs -n1 basename또는 find ... | xargs basename -afind ... | basename이전 두 구현 작동한다는 것이다 basename무시 stdin.
8bittree

19

이 시도:

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

이것은 설명이 아니라 해결 방법입니다. 해결 방법은 찾은 파일에 대해 -exec를 통해 'basename'을 호출하는 것만 큼 좋습니다.
akira

4
+1 ... 설명이 아닌 동안, 이것은 내가 보여준 xargs 스위치를 조사하게 할 것이며, 결국 akira와 john t의 답변을 읽은 이마를 때리는 동작으로 이어질 것입니다.
quack quixote

1
이것이 내가하는 방법입니다. find명령 의 모든 내용을 배우고 싶지는 않으므로 파일을 찾고 나열하는 데만 사용하고 다른 모든 것에는 xargs를 사용합니다.
Ryan C. Thompson

4

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


3

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.