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