Я пытался найти все файлы определенного типа распространенными в подкаталогах, и в моих целях мне только было нужно имя файла. Я пытался снять компонент контура через 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
хочет всего один параметр... не много из. И xargs
создает много параметров.
Для решения настоящей проблемы (только перечисляют имена файлов):
find . -name '*.deb' -printf "%f\n"
Который печатает просто 'базовое имя' (человек находят):
%f File's name with any leading directories
removed (only the last element).
базовое имя только принимает отдельный аргумент. Используя -exec
работы правильно, потому что каждый {}
заменяется текущим именем файла, обрабатываемым, и команда выполняется однажды на подобранный файл, вместо того, чтобы пытаться отправить все аргументы базовому имени сразу.