Чтобы ответить на ваш вопрос, xargs
можно использовать, когда вам нужно взять вывод одной команды и использовать его в качестве аргумента для другой. В вашем первом примере grep
берет данные из стандартного ввода, а не в качестве аргумента. Итак, xargs
не нужен.
xargs
берет данные из стандартного ввода и выполняет команду. По умолчанию данные добавляются в конец команды в качестве аргумента. Однако его можно вставить куда угодно, используя заполнитель для ввода. Традиционный заполнитель — {}
; используя это, ваша примерная команда может быть записана как:
find /etc -name "*.txt" | xargs -I {} ls -l {}
Если у вас есть 3 текстовых файла в /etc
, вы получите полный список каждого из них. Конечно, вы могли бы просто написать ls -l /etc/*.txt
и избавить себя от хлопот.
Другой пример позволяет вам переименовывать эти файлы и требует, чтобы заполнитель {}
использовался дважды.
find /etc -name "*.txt" | xargs -I {} mv {} {}.bak
Это оба плохих примера, и они сломаются, как только у вас будет имя файла, содержащее пробелы. Вы можете обойти это, сказав find
разделять имена файлов нулевым символом.
find /etc -print0 -name "*.txt" | xargs -I {} -0 mv {} {}.bak
Мое личное мнение таково, что почти всегда есть альтернативы использованию xargs
, и вам будет лучше их изучить.
person
miken32
schedule
23.02.2016
128KiB
) см. Что определяет максимальный размер одного аргумента команды?. Когда ваша командная строка превышает этот размер, вы можете использоватьxargs
, который разбивает ее и обрабатывает команду за вас. - person David C. Rankin   schedule 24.02.2016