Linux xargs команда


Быстрый вопрос. Команда

cat * | wc -c

Не требует xargs, но команда

ls | xargs echo

Требуется команда xargs. Может быть, кто-нибудь объяснит мне концепцию ксаргов более ясно. Спасибо.

2 2

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

wc считывает данные из своего стандартного ввода , тогда как echo выводит свои аргументы командной строки.