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.c
inserta 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 rm
para eliminar todo exceptonotes.txt
, o en general, nunca analizar lals
salida . 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 extglob
set) orm ^notes.txt
en Zsh (conEXTENDED_GLOB
) etc.find . -maxdepth 1 -mindepth 1 -print0 | xargs -0
lugar 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 arguments
Orm 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 quecat
puede tomar argumentos o STDIN, pero hace cosas diferentes con ellos):xargs
puede considerarse como convertir la entrada de estilo STDIN en argumentos:echo
en realidad hace más o menos lo contrario: convierte sus argumentos a STDOUT (que puede canalizarse a STDIN de algún otro comando):fuente
cat
toma entrada deSTDIN
yrm
no lo hace. Para dichos comandos, debexargs
iterarSTDIN
línea por línea y ejecutar los comandos con parámetros de línea de comandos.fuente