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