Próbowałem znaleźć wszystkie pliki określonego typu rozproszone w podkatalogach i do moich celów potrzebowałem tylko nazwy pliku. Próbowałem usunąć komponent ścieżki przez basename
, ale to nie działało z 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.
Otrzymuję to samo (dokładnie ten sam błąd) z jedną z tych odmian:
$ find . -name '*.deb' -print0 | xargs -0 basename
$ find . -name '*.deb' -print | xargs basename {}
To z kolei działa zgodnie z oczekiwaniami:
$ find . -name '*.deb' -exec basename {} \;
foo
bar
baz
Dzieje się tak w aktualnych wersjach Cygwin i Debian 5.0.3. Moja diagnoza jest taka, że xargs z jakiegoś powodu przekazuje dwie linie wejściowe do basename, ale dlaczego? Co tu się dzieje?
command-line
find
gnu
xargs
quack quixote
źródło
źródło
xargs
to, że tworzy listę argumentów i przekazuje każdy do następnego polecenia? w przeciwnym razie jaka jest różnica między tym afind . -name '*.deb' | basename
?-a
opcję: „obsługuje wiele argumentów i traktuje każdy z nich jak nazwę”.xargs
konwertujestdin
na argumenty poleceń. W pewnym sensie jest to przeciwieństwoecho
, na które konwertuje swoje argumentystdout
. Różnica pomiędzyfind ... | xargs -n1 basename
albofind ... | xargs basename -a
ifind ... | basename
to, że były dwa będą pracować z wdrożeńbasename
, które ignorująstdin
.Spróbuj tego:
źródło
find
polecenia, więc używam go tylko do wyszukiwania i wyświetlania plików, a do innych rzeczy używam xargs.basename akceptuje tylko jeden argument. Używanie
-exec
działa poprawnie, ponieważ każdy z nich{}
jest zastępowany przetwarzaną bieżącą nazwą pliku, a polecenie jest uruchamiane raz dla dopasowanego pliku , zamiast próbować wysłać wszystkie argumenty do nazwy basename za jednym razem.źródło
xargs
może zostać zmuszony do przekazania tylko jednego argumentu ...find . -name '*.deb' -print | xargs -n1 basename
Działa to, jednak przyjęta odpowiedź jest używana
find
w bardziej odpowiedni sposób. Znalazłem to pytanie, szukającxargs basename
problemów, ponieważ używam innego polecenia, aby uzyskać listę lokalizacji plików.-n1
Flaga dlaxargs
był ostateczną odpowiedzią dla mnie.źródło