Я пытался найти все файлы определенного типа, распределенные в подкаталогах, и для моих целей мне нужно было только имя файла. Я попытался удалить компонент пути через 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, но почему? Что тут происходит?
command-line
find
gnu
xargs
шарлатан
источник
источник
xargs
том, что он создает список аргументов и передает каждый из них команду, которая идет после? иначе какая разница между этим иfind . -name '*.deb' | basename
?-a
опцию: «поддерживать несколько аргументов и обрабатывать каждый как имя».xargs
преобразуетstdin
в аргументы команды. В некотором смысле, это противоположностьecho
, которая преобразует свои аргументы вstdout
. Разница междуfind ... | xargs -n1 basename
илиfind ... | xargs basename -a
иfind ... | basename
заключается в том, что первые два будут работать с реализациями,basename
которые игнорируютstdin
.Попробуй это:
источник
find
команды, поэтому я использую ее только для поиска и перечисления файлов, а для всего остального я использую xargs.Базовое имя принимает только один аргумент. Использование
-exec
работает должным образом, поскольку каждое из них{}
заменяется текущим обрабатываемым именем файла, и команда запускается один раз для каждого сопоставленного файла , вместо того, чтобы пытаться отправить все аргументы базовому имени за один раз.источник
xargs
можно заставить просто передать один аргумент, а также ...find . -name '*.deb' -print | xargs -n1 basename
Это работает, однако принятый ответ используется
find
более подходящим способом. Я нашел этот вопрос в поискеxargs basename
проблем, так как я использую другую команду для получения списка расположений файлов.-n1
Флагxargs
был окончательный ответ для меня.источник