Supongamos que quiero eliminar todos los archivos en un directorio excepto uno llamado "notes.txt". Me gustaría hacer esto con el gasoducto, ls | grep -v "notes.txt" | xargs rm. ¿Por qué necesito xargs si la salida de la segunda tubería es la entrada que rm debería usar?
En aras de la comparación, la canalización echo "#include <knowledge.h>" | cat > foo.cinserta el texto repetido en el archivo sin el uso de xargs. ¿Cuál es la diferencia entre estas dos tuberías?

ls | grep -v "notes.txt" | xargs rmpara eliminar todo exceptonotes.txt, o en general, nunca analizar lalssalida . Su comando se rompería si un solo archivo contuviera un espacio, por ejemplo. La forma más segura seríarm !(notes.txt)en Bash (conshopt -s extglobset) orm ^notes.txten Zsh (conEXTENDED_GLOB) etc.find . -maxdepth 1 -mindepth 1 -print0 | xargs -0lugar dels | xargs:-)Respuestas:
Está confundiendo dos tipos muy diferentes de entrada: STDIN y argumentos. Los argumentos son una lista de cadenas proporcionadas al comando cuando comienza, generalmente al especificarlas después del nombre del comando (p . Ej.
echo these are some argumentsOrm file1 file2). STDIN, por otro lado, es una secuencia de bytes (a veces texto, a veces no) que el comando puede (opcionalmente) leer después de que comience. Aquí hay algunos ejemplos (tenga en cuenta quecatpuede tomar argumentos o STDIN, pero hace cosas diferentes con ellos):xargspuede considerarse como convertir la entrada de estilo STDIN en argumentos:echoen realidad hace más o menos lo contrario: convierte sus argumentos a STDOUT (que puede canalizarse a STDIN de algún otro comando):fuente
cattoma entrada deSTDINyrmno lo hace. Para dichos comandos, debexargsiterarSTDINlínea por línea y ejecutar los comandos con parámetros de línea de comandos.fuente