Ir al contenido principal

Cómo usar el comando xargs en Linux

¿Necesita encadenar algunos comandos de Linux, pero uno de ellos no acepta la entrada canalizada? xargs puede tomar la salida de un comando y enviarla a otro comando como parámetros.

Todas las utilidades estándar de Linux tienen tres flujos de datos asociados. Son la secuencia de entrada estándar (stdin), la secuencia de salida estándar (stdout) y la secuencia de error estándar (stderr).

Estas secuencias funcionan con texto. Enviamos la entrada (stdin) a un comando usando texto, y la respuesta (stdout) se escribe en la ventana de terminal como texto. Los mensajes de error también se escriben en la ventana del terminal como texto (stderr).

Una de las excelentes características de los sistemas operativos tipo Linux y Unix es la capacidad de canalizar la salida stdout de un comando a la entrada stdin de un segundo comando. Al primer comando no le importa que su salida no vaya a una ventana de terminal, y al segundo comando no le importa que su entrada no provenga de un teclado.

Aunque todos los comandos de Linux tienen las tres secuencias estándar, no todas aceptan la salida estándar de otro comando como entrada a su entrada estándar. Eso significa que no puede canalizar la entrada a ellos.

xargs es un comando para construir canalizaciones de ejecución utilizando los flujos de datos estándar. Al usar xargs podemos hacer que los comandos como echo, rm y mkdir acepten la entrada estándar como argumentos.

El comando xargs

xargs aceptará la entrada canalizada. También puede aceptar entradas de un archivo. xargs usa esa entrada como parámetros para los comandos con los que le hemos dicho que trabaje. Si no le decimos a xargs que trabaje con un comando específico, usará echo de manera predeterminada.

Podemos usar eso para demostrar cómo xargs siempre generará una sola línea de salida, incluso desde la entrada de varias líneas.

Si usamos la opción -1 (enumerar un archivo por línea) con ls, obtenemos una sola columna de nombres de archivos.

 ls -1 ./*.sh 

Esto enumera los archivos de script de shell en el directorio actual.

Obtenemos una sola columna como se esperaba. Si lo canalizamos a través de xargs, ¿qué obtenemos?

 ls -1 ./*.sh | xargs 

La salida se escribe en la ventana del terminal, como una larga secuencia de texto.

Es esta capacidad eso permite que xargs alimente parámetros a otros comandos.

Uso de xargs con wc

Podemos usar xargs para que wc cuente fácilmente las palabras, caracteres y líneas en múltiples archivos.

 ls * .page | xargs wc 

Esto es lo que sucede:

  • ls enumera los archivos * .page y pasa la lista a xargs.
  • xargs pasa los nombres de archivo a wc.
  • wc trata los nombres de archivo como si los hubiera recibido como parámetros de línea de comando.

Las estadísticas de cada archivo se muestran junto con un total general.

Uso de xargs con confirmación

Podemos usar la opción -p (interactivo) para que xargs nos solicite confirmación de que estamos felices de que continúe.

Si pasamos una cadena de nombres de archivo para tocar, a través de xargs, touch creará los archivos para nosotros.

 echo 'one two tres '| xargs -p touch 

Se muestra el comando que se ejecutará y xargs espera a que respondamos escribiendo "y" o "Y", o "n" o "N", y presionando Enter.

Si solo presiona Enter, se trata como "n". El comando solo se ejecuta si escribe "y" o "Y".

Presionamos "y" y presionamos Enter. Podemos usar ls para verificar que los archivos se hayan creado.

 ls one two three 

Uso de xargs con múltiples comandos

Podemos usar múltiples comandos con xargs usando la opción -I (argumentos iniciales).

Esta opción define una "cadena de reemplazo". Dondequiera que aparezca el token para la cadena de reemplazo en el línea de comando, se insertan los valores que se proporcionaron a xargs.

Usemos el comando de árbol para ver los subdirectorios del directorio actual. La opción -d (directorio) hace que el árbol ignore los archivos y solo informe en los directorios.

 árbol -d 

Hay un solo subdirectorio llamado "imágenes".

En un archivo llamado "directorios.txt", tenemos los nombres de algunos directorios que deseamos haber creado. Podemos ver su contenido usando cat.

 cat directorios.txt 

Vamos a usar esto como datos de entrada para xargs El comando al que vamos es este:

 cat directorios.txt | xargs -I% sh -c 'echo%; mkdir% '

Esto se desglosa así:

  • cat directorios.txt |: Esto empuja el contenido del archivo directrories.txt (todos los nuevos nombres de directorio) en xargs.
  • xargs -I%: Esto define una "cadena de reemplazo" con el token "%".
  • sh -c: Esto inicia una nueva subshell. El -c (comando) le dice al shell que lea los comandos desde la línea de comando.
  • ‘echo%; mkdir% ’: cada uno de los tokens"% "será reemplazado por los nombres de directorio que pasan xargs. El comando echo imprimirá el nombre del directorio; el comando mkdir creará el directorio.

Los directorios se enumeran uno por uno.

Podemos usar el árbol una vez más para verificar que se hayan creado los directorios.

 tree -d 

Copiando archivos a múltiples ubicaciones

Podemos usar xargs para permitirnos copiar archivos a múltiples ubicaciones con un solo comando.

Vamos a canalizar los nombres de dos directorios en xargs como parámetros de entrada. Le diremos a xargs que solo pase uno de estos parámetros a la vez al comando con el que está trabajando.

En este caso, el comando es cp. Por lo tanto, el efecto es llamar a cp dos veces, cada vez con uno de los dos directorios como parámetro de línea de comandos. El parámetro xargs que permite que esto suceda es la opción -n (número máximo). Vamos a configurar esto para que sea uno.

También estamos usando la opción -v (detallado) con cp para que informe lo que está sucediendo.

 echo ~ / Copias de seguridad / ~ / Documentos / archivos de página / | xargs -n 1 cp -v ./*.page[/PREfont>

Los archivos se copian en los dos directorios, un directorio a la vez. cp informa cada acción de copia de archivo para que podamos ver que se llevan a cabo.

Eliminación de archivos en directorios anidados

Si los nombres de archivo tienen espacios y caracteres extraños en ellos, como los caracteres de nueva línea, los xargs no podrán interpretarlos correctamente. Podemos superar ese problema utilizando la opción -0 (terminador nulo). Esto le dice a xargs que use el carácter nulo como delimitador final para los nombres de archivo.

Vamos a usar find en este ejemplo. find tiene su propia opción para tratar con espacios en blanco y caracteres extraños en los nombres de archivo. Es la opción -print0 (nombre completo, carácter nulo).

 find. -name "* .png" -tipo f -print0 | xargs -0 rm -v -rf "{}" 

Esto se descompone así:

  • find. -name “* .png”: find buscará en el directorio actual “.” objetos con nombres que coincidan con “* .png” que sean archivos (tipo -f).
  • -print0: los nombres serán terminados por un carácter nulo, y los espacios y caracteres extraños serán atendidos.
  • xargs -0: xargs también considerará que los nombres de los archivos serán terminados en nulo, y los espacios y caracteres extraños no causar problemas.
  • rm -v -rf “{}”: rm será detallado e informará lo que está sucediendo (-v). Será recursivo (-r) y mirará a través de subdirectorios anidados, y eliminará archivos sin preguntar (-f). El "{}" se reemplaza por cada nombre de archivo.

Se buscan todos los subdirectorios y se eliminan los archivos que coinciden con el patrón de búsqueda.

Eliminación de directorios anidados

Supongamos que queremos eliminar un conjunto de subdirectorios anidados. tree nos permitirá verlos.

 tree -d 

 find. -name "level_one" -type d printo | xargs -o rm -v -rf "{}" 

Este comando usará find para buscar recursivamente dentro del directorio actual. El objetivo de búsqueda es un directorio llamado "level_one". Los nombres de directorio se pasan a través de xargs a rm.

Los únicos cambios significativos entre este comando y el comando anterior son, el término de búsqueda es el nombre del directorio superior, y -type d le dice a find que busque directorios, no archivos.

El nombre de cada directorio se imprime a medida que se elimina. Podemos verificar con el árbol:

 tree -d 

Todos los subdirectorios anidados se eliminan.

Eliminar Todos los archivos, excepto para un tipo de archivo

Podemos usar find, xargs y rm para eliminar todos los archivos aparte del tipo que queremos conservar. Es ligeramente contradictorio, pero proporcionamos el nombre del tipo de archivo que deseamos conservar, no el nombre de los que queremos eliminar.

La opción -no le dice a find que devuelva los nombres de los archivos que no No coincide con el patrón de búsqueda. Estamos utilizando la opción -I (argumentos iniciales) con xargs una vez más. Esta vez, el token de reemplazo de cadena que estamos definiendo es "{}". Esto se comportará exactamente igual que el token de reemplazo de cadena que generamos anteriormente, que resultó ser un "%".

 find. -type f -not - nombre "* .sh" -print0 | xargs -0 -I {} rm -v {} 

Podemos verificar con ls. Los únicos archivos que quedan en el directorio son los que coinciden con el patrón de búsqueda "* .sh".

 ls -l 

Creando un archivo de archivo con Xargs

Podemos usar find para buscar archivos y pasarlos a través de xargs a tar, para crear un archivo de archivo.

Vamos a buscar en el actual directorio. El patrón de búsqueda es "* .page", por lo que buscaremos archivos ".page".

 find ./ - name "* .page" -type f -print0 | xargs -0 -tar -cvzf page_files.tar.gz 

Los archivos se enumeran como se esperaba, a medida que se crea el archivo.

El mediador de datos

A veces necesitas un poco de andamiaje cuando estás apilando cosas juntas. xargs cierra la brecha entre los comandos que pueden bombear información y los comandos que no están diseñados para incorporarla.

Ambos xargs y find tienen una gran cantidad de opciones. Le recomendamos que consulte sus páginas de manual para obtener más información.

Fuente: How to Geek

Vea También:

Comentarios

Entradas populares de este blog

¿Qué son stdin, stdout y stderr en Linux?

stdin, stdout y stderr son tres flujos de datos creados al iniciar un comando de Linux. Puede usarlos para saber si sus scripts se están canalizando o redirigiendo. Le mostramos cómo. Streams Unir dos puntos Tan pronto como Cuando comienzas a aprender sobre Linux y sistemas operativos tipo Unix, te encontrarás con los términos stdin, stdout y stederr. Estas son tres secuencias estándar que se establecen cuando se ejecuta un comando de Linux. En informática, un flujo es algo que puede transferir datos. En el caso de estas corrientes, esos datos son texto. Las corrientes de datos, como las corrientes de agua, tienen dos extremos. Tienen una fuente y un flujo de salida. Cualquiera que sea el comando de Linux que esté utilizando, proporciona un extremo de cada transmisión. El otro extremo está determinado por el shell que lanzó el comando. Ese extremo estará conectado a la ventana del terminal, conectado a una tubería o redirigido a un archivo u otro

Cómo usar el comando Echo en Linux

El comando echo es perfecto para escribir texto formateado en la ventana del terminal.Y no tiene que ser texto estático. Puede incluir variables de shell, nombres de archivo y directorios. También puede redirigir echo para crear archivos de texto y archivos de registro. Siga esta sencilla guía para descubrir cómo. Echo repite lo que le dice que repita A Zeus le gustaba abandonar el Olimpo para asociarse con hermosas ninfas. En un viaje, le dijo a una ninfa de la montaña llamada Echo que matara a su esposa, Hera, si ella lo seguía. Hera vino a buscar a Zeus, y Echo hizo todo lo que pudo para mantener a Hera en conversación. Finalmente, Hera perdió los estribos y maldijo al pobre Echo para que solo repitiera las últimas palabras que alguien más había dicho. Lo que Hera le hizo a Zeus cuando lo alcanzó es la suposición de nadie. Y eso, más o menos, es mucho eco en la vida. Repite lo que se le ha dicho que repita. Esa es una función simple, pero vit

Cómo usar el comando rev en Linux

El comando rev de Linux invierte las cadenas de texto. Este comando puede operar en el texto proporcionado o en un archivo, y parece ser aparentemente simple. Pero al igual que muchas utilidades de la línea de comandos, su poder real se hace evidente cuando lo combinas con otros comandos. El comando rev es una de esas sencillas utilidades de Linux que, a primera vista, parece ser una especie de rareza. Realiza una sola función: invierte cadenas. Y aparte de poder imprimir una página de ayuda rápida (-h) y mostrarle su número de versión (-V), no acepta ninguna opción de línea de comandos. Por lo tanto, rev invierte cadenas, ¿y eso es? ¿No hay variaciones u opciones? Pues sí y no. Sí, no tiene permutaciones, pero no, eso no es todo. Este tutorial le muestra cómo combinarlo para operaciones poderosas. Cuando usa rev como un bloque de construcción en secuencias de comandos más complicadas, realmente comienza a mostrar su valor. rev es uno de un grupo de