Linux xargs команда
Быстрый вопрос. Команда
cat * | wc -c
Не требует xargs, но команда
ls | xargs echo
Требуется команда xargs. Может быть, кто-нибудь объяснит мне концепцию ксаргов более ясно. Спасибо.
2 ответа:
Короче говоря,
xargs
преобразуетstdin
(стандартный ввод) в аргументы для указанной команды. Например$ seq 1 3 1 2 3 $ seq 1 3 | xargs echo 1 2 3
seq
, Как видите, выводит последовательность вstdout
. Мы трубим (|
), что выход вxargs
наstdin
.xargs
вызываетecho
сstdin
в качестве аргументов, поэтому мы получаемecho 1 2 3
.As el.Пескадо сказал:,
wc
принимает входные данные наstdin
(вы также можете дать ему аргумент file). Посколькуcat
печатает файл вstdout
, вы можете передать его непосредственно вwc
.$ cat text This is only a test $ cat text | wc 2 5 20 $ wc text 2 5 20 text
echo
не принимает ничего отstdin
. Это было бы странно, так как работаecho
заключается в том, чтобы печатать вstdout
- вы уже можете напечатать все, что вам нужно. Итак, вы используетеxargs
для преобразования потока в аргументы.
echo
возможно, это слишком тривиальная команда, чтобы видеть, что происходит, поэтому вот более реальный пример. Скажем, у нас есть каталог с некоторыми файлами в нем:$ ls bar1 foo1 foo2 foo3 foo4 foo5 foo6
У нас было это до сих пор с
foo
, и мы хотим удалить все из них, но мы не утруждает себя набиратьrm foo1 foo2 ...
. В конце концов, мы программисты, и мы ленивы. Вот что мы можем сделать...$ ls foo* | xargs rm $ ls bar1
rm
ожидает аргументов,ls foo*
печатает каждый файл, который мы хотим удалить, иxargs
выполняет перевод.
В качестве дополнительной заметки, иногда вы хотите разделить
stdin
на более мелкие кусочки.xargs -n
очень полезен для этого и передает N аргументов за один раз в вашу конечную команду.$ ls foo* | xargs -n2 echo foo1 foo2 foo3 foo4 foo5 foo6