xargs -I опция

12

Руководство xargs гласит:

-I replace-str
--replace [= replace-str]
-i [replace-str]
Заменить вхождения replace-str в исходных аргументах именами, считанными из стандартного ввода.

Я не понимаю эту часть: with names read from standard input.

Например, что происходит с:

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0I{} echo | wc -l

Приведенный выше фрагмент кода подсчитывает общее количество файлов / каталогов в каталоге.

Кто-нибудь может объяснить это для меня?

sjsam
источник

Ответы:

20

«с именами, считанными из стандартного ввода» означает, что он xargsберет данные, поступающие на его стандартный ввод, разделяет их и использует для запуска команды, указанной в его аргументах. По умолчанию он разделяется на пробелы или символы новой строки и работает echoс максимально возможным количеством аргументов за раз.

-0Вариант в вашем примере инструктирует , xargsчтобы разделить его вход на нулевые байты , а не пробелами или символами новой строки. В сочетании с find's' -print0это позволяет правильно обрабатывать имена файлов, содержащие пробелы или переводы строк.

-IОпция изменяет способ , построены новые командные строки. Вместо того, чтобы добавлять как можно больше аргументов за раз, xargsбудет брать одно имя за раз из своего ввода, искать данный токен ( {}здесь) и заменять его на имя.

В вашем примере {}его нет в шаблоне команды, заданной для xargs, поэтому фактически xargsон запускается echoбез аргументов, один раз для каждого имени файла, данного ему find. Чтобы увидеть это, опустите wc:

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0I{} echo

Вы увидите серию пустых строк ... Сравните это с

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0I{} echo {}

а также

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 echo

а также

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0

чтобы лучше понять.

Стивен Китт
источник