найдите: - должностное лицо по сравнению с xargs (иначе, Почему действительно “находит | xargs базовое имя” повреждение?)

Я пытался найти все файлы определенного типа распространенными в подкаталогах, и в моих целях мне только было нужно имя файла. Я пытался снять компонент контура через 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 по некоторым причинам передает две входных строки базовому имени, но почему? Что продолжается здесь?

10
задан 13.02.2010, 09:28

3 ответа

Поскольку basename хочет всего один параметр... не много из. И xargs создает много параметров.

Для решения настоящей проблемы (только перечисляют имена файлов):

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

Который печатает просто 'базовое имя' (человек находят):

 %f     File's name with any leading directories
        removed (only the last element).
22
ответ дан 07.12.2019, 12:33

Попробуйте это:

find . -name '*.deb' | xargs -n1 basename
18
ответ дан 07.12.2019, 12:33

базовое имя только принимает отдельный аргумент. Используя -exec работы правильно, потому что каждый {} заменяется текущим именем файла, обрабатываемым, и команда выполняется однажды на подобранный файл, вместо того, чтобы пытаться отправить все аргументы базовому имени сразу.

4
ответ дан 07.12.2019, 12:33

Теги

Похожие вопросы