xargs -I opción

12

El manual de xargs dice:

-I replace-str
--replace [= replace-str]
-i [replace-str]
Reemplaza las ocurrencias de replace-str en los argumentos iniciales con nombres leídos de la entrada estándar.

No entiendo esta parte: with names read from standard input.

Por ejemplo, qué está pasando con:

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

El fragmento de código anterior cuenta el total de archivos / directorios dentro de un directorio.

¿Alguien podría explicar esto por mí?

sjsam
fuente

Respuestas:

20

"con nombres leídos de la entrada estándar" significa que xargstoma los datos que ingresan en su entrada estándar, los divide y los usa para ejecutar el comando dado en sus argumentos. Por defecto, se divide en espacios en blanco o nuevas líneas, y se ejecuta echocon tantos argumentos a la vez como sea posible.

La -0opción en su ejemplo le indica xargsque divida su entrada en bytes nulos en lugar de espacios en blanco o líneas nuevas. Combinado con find's -print0, esto permite que los nombres de archivo que contienen espacios en blanco o líneas nuevas se manejen correctamente.

La -Iopción cambia la forma en que se crean las nuevas líneas de comando. En lugar de agregar tantos argumentos como sea posible a la vez, xargstomará un nombre a la vez de su entrada, busque el token dado ( {}aquí) y reemplácelo con el nombre.

En su ejemplo, {}no está presente en la plantilla de comando dada xargs, por lo que en efecto xargsse le indica que se ejecute echosin argumento, una vez por cada nombre de archivo que le haya dado find. Para ver esto, suelte el wc:

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

Verás una serie de líneas en blanco ... Compara esto con

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

y

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

y

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

para tener una mejor comprensión

Stephen Kitt
fuente