Pregunta 1¿Cuál describe correctamente lo que hace xargs?
xargs — Construir comandos desde la entrada estándar
Coloca la entrada estándar como argumentos con echo a b | xargs echo, ejecuta palabra por palabra con -n1, inserta valores en {} con -I{}, y procesa en lote find . -name '*.log' | xargs — con diagramas y una terminal en vivo.
Convertir la entrada estándar en argumentos — xargs y -n1
Un pipe pasa la salida del comando anterior como entrada estándar del siguiente comando. Pero rm y echo no leen la entrada estándar — solo actúan sobre los valores escritos como argumentos. xargs es el comando que toma lo que recibe en la entrada estándar y lo reorganiza como argumentos para el comando que escribes después de él, así que con echo a b | xargs echo, la a y la b se convierten en argumentos del echo final.
Por defecto, xargs pasa las palabras que recibe a una sola ejecución, agrupadas todo lo posible. Añade -n1 y las separa, ejecutando el comando una vez por palabra.
| Sintaxis | Qué hace |
|---|---|
| xargs | Coloca la entrada como argumentos y ejecuta el comando |
xargs -n1 | Ejecuta el comando una vez por argumento |
xargs -I{} | Reemplaza {} con la entrada y la inserta donde quieras |
find ... | xargs | Ejecuta un solo lote de procesamiento sobre lo encontrado |
| xargs echo rm | Imprime el comando que se ejecutaría, para comprobarlo primero |
echo se pasa por pipe a xargs como entrada estándar y se reorganiza en argumentos. Una ejecución agrupada, o tres ejecuciones palabra por palabra — esa es la diferencia que marca -n1.printf 'one two three\n' | xargs echo got: # got: one two three (agrupado, 1 ejec.)
printf 'one\ntwo\nthree\n' | xargs -n1 echo item: # item: one / item: two / item: three
La cadena de reemplazo y la integración con find — -I{}
xargs -I{} construye el comando insertando cada línea de la entrada en la posición de `{}`. Como {} puede ir donde quieras, incluso en medio del comando, puedes ejecutar una forma como echo file_{}.txt — con texto fijo alrededor del valor — línea por línea.
Cuando quieres ejecutar algo sobre los archivos que find encuentra, la forma find ... | xargs es la habitual. xargs coloca como argumentos las rutas que find imprime y ejecuta un solo lote de procesamiento sobre los resultados de la búsqueda. Combínalo con -I{} y puedes procesar cada ruta encontrada insertándolas una a una en `{}`.
find imprime se pasan a xargs como una línea = un elemento, y -I{} inserta cada una en `{}` y las ejecuta una a una.printf 'alpha\nbeta\n' | xargs -I{} echo 'name = {}' # name = alpha / name = beta
mkdir -p logs # crea el directorio fuente
touch logs/a.log logs/b.log # crea 2 archivos
find logs -name '*.log' | xargs -I{} echo 'found {}' # found logs/a.log / found logs/b.log
Procesar uno a uno — elegir entre -n1 y -I{}
Tanto -n1 como -I{} ejecutan el comando uno a uno, pero difieren en dónde va el valor y cómo se separa la entrada. -n1 pasa palabras (trozos separados por espacios o saltos de línea) una a una como argumentos finales del comando. -I{} toma líneas una a una y las inserta en la posición donde escribiste `{}`.
Usa `-n1` cuando solo necesitas el valor al final, y `-I{}` cuando quieres texto fijo alrededor del valor, como {}.bak.
| Aspecto | `-n1` | `-I{}` |
|---|---|---|
| Dónde va el valor | Se alinea al final del comando | Va donde escribiste {} |
| Unidad de separación | Palabras (por espacios/saltos de línea) | Líneas (una línea = un elemento) |
| Mejor para | Solo pasar argumentos por turno | Construir una forma con texto fijo alrededor del valor |
printf 'a\nb\n' | xargs -n1 echo prefix # prefix a / prefix b (al final)
printf 'a\nb\n' | xargs -I{} echo {}_done # a_done / b_done (insertado en medio)
Procesamiento en lote en la práctica — comprueba antes de ejecutar
En el trabajo real, usas xargs para copias en lote y borrados en lote sobre los objetivos que find recopila. Como -I{} puede insertar el mismo valor en dos o más sitios, funciona con comandos que toman dos argumentos como cp origen destino, permitiéndote crear copias de seguridad "nombre original + .bak" todas a la vez.
No ejecutes de golpe operaciones irreversibles como rm. Si ejecutas xargs echo rm antes de xargs rm, el comando que se ejecutaría solo se imprime y no se borra nada. Comprueba los objetivos listados, luego quita el echo y ejecútalo de verdad — este enfoque de dos pasos, comprobar y luego ejecutar, es la forma segura de proceder.
echo antes de rm para comprobar los objetivos imprimiéndolos primero, y luego ejecuta.mkdir -p cache
touch cache/a.tmp cache/b.tmp
find cache -name '*.tmp' | xargs echo rm # solo imprime rm cache/a.tmp cache/b.tmp
find cache -name '*.tmp' | xargs rm # ejecuta de verdad una vez verificado
Verificación de conocimientos
Responde cada pregunta una a una.
Pregunta 2¿Cómo se comporta printf 'a\nb\nc\n' | xargs -n1 echo?
Pregunta 3¿Qué representa {} en xargs -I{}?