Categorías: Linux

Cómo usar el comando xargs en Linux

Fatmawati Achmad Zaenuri / Shutterstock

¿Necesita encadenar algunos comandos de Linux, pero uno de ellos no acepta 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 el flujo de entrada estándar (stdin), el flujo de salida estándar (stdout) y el flujo de error estándar (stderr).

Estos flujos 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 grandes características de los sistemas operativos Linux y tipo 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 los tres flujos estándar, no todos aceptan la salida estándar de otro comando como entrada a su stdin. Eso significa que no puede canalizar la entrada a ellos.

xargses un comando para construir canalizaciones de ejecución utilizando los flujos de datos estándar. Mediante el uso xargsque pueden hacer los comandos tales como echo, rmy mkdir aceptar la entrada estándar como argumentos.

El comando xargs

xargsaceptará entrada entubada. También puede aceptar la entrada de un archivo. xargsusa esa entrada como parámetros para los comandos con los que le hemos dicho que trabaje. Si no le decimos xargsque trabaje con un comando específico, se usará por defecto echo.

Podemos usar eso para demostrar cómo xargssiempre generará una sola línea de salida, incluso a partir de una entrada de varias líneas.

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

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, xargs¿qué obtenemos?

ls -1 ./*.sh | xargs

La salida se escribe en la ventana de la terminal, como un largo flujo de texto.

Es esta capacidad la que permite xargsintroducir parámetros en otros comandos.

Usar xargs con wc

Podemos utilizar xargspara contar fácilmente wclas palabras, caracteres y líneas en varios archivos.

ls * .page | xargs wc

Esto es lo que pasa:

  • lsenumera los archivos * .page y pasa la lista a xargs.
  • xargspasa 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.

Usar xargs con confirmación

Podemos usar la -popción (interactiva) para que xargsnos pida confirmación de que estamos felices de que proceda.

Si se pasa una cadena de nombres de archivos a touchtravés de xargs, touchserá crear los archivos para nosotros.

echo 'uno dos tres' | xargs -p touch

Se muestra el comando que se va a ejecutar y xargsespera que respondamos escribiendo “y” o “Y”, o “n” o “N”, y presionando Enter.

Si simplemente presiona Enter, se trata como «n». El comando solo se ejecuta si escribe “y” o “Y”.

Presionamos “y” y presionamos Enter. Podemos utilizar lspara comprobar que los archivos han sido creados.

es uno dos tres

Usar xargs con varios comandos

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

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

Usemos el treecomando para mirar los subdirectorios del directorio actual. La -dopción (directorio) hace treeque se ignoren los archivos y solo se informe sobre 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 mirar su contenido usando cat.

cat directorios.txt

Usaremos 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 descompone así:

  • cat directorios.txt | : Esto inserta 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 subcapa. El -c(comando) le dice al shell que lea los comandos de la línea de comandos.
  • ‘eco %; mkdir% ‘ : cada uno de los tokens “%” será reemplazado por los nombres de directorio que se pasan  xargs. El echocomando imprimirá el nombre del directorio; el mkdircomando creará el directorio.

Los directorios se enumeran uno por uno.

Podemos usar treeuna vez más para verificar que se hayan creado los directorios.

árbol -d

Copiar archivos en varias ubicaciones

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

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

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

También estamos usando la -vopción (detallada) con cppara que informe lo que está sucediendo.

echo ~ / Backups / ~ / Documents / page-files / | xargs -n 1 cp -v ./*.page

Los archivos se copian en los dos directorios, un directorio a la vez. cpinforma cada acción de copia de archivo para que podamos verlas.

Eliminar archivos en directorios anidados

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

Vamos a usar finden este ejemplo. findtiene su propia opción para lidiar con espacios en blanco y caracteres extraños en nombres de archivos. Es la -print0opción (nombre completo, carácter nulo).

encontrar . -nombre "* .png" -type f -print0 | xargs -0 rm -v -rf "{}"

Esto se descompone así:

  • encontrar . -name «* .png» : find va a buscar en el directorio actual «.» para objetos con nombres que coincidan con «* .png» que sean archivos ( type -f).
  • -print0 : los nombres terminarán con un carácter nulo y se atenderán los espacios y caracteres extraños.
  • xargs -0 : xargs también considerará que los nombres de archivo terminan en nulo, y los espacios y caracteres extraños no causarán problemas.
  • rm -v -rf “{}” : rm será detallado e informará lo que está sucediendo ( -v). Va a ser recursivo (-r) y buscará 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

Digamos que queremos eliminar un conjunto de subdirectorios anidados. treenos dejará verlos.

árbol -d

encontrar . -nombre "nivel_uno" -tipo d printo | xargs -o rm -v -rf "{}"

Este comando usará find para buscar de forma recursiva dentro del directorio actual. El objetivo de la búsqueda es un directorio llamado «level_one». Los nombres de directorio se transfieren xargsa rm.

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

El nombre de cada directorio se imprime a medida que se elimina. Podemos consultar con tree:

árbol -d

Se eliminan todos los subdirectorios anidados.

Eliminar todos los archivos, excepto un tipo de archivo

Podemos utilizar find, xargsy rmeliminar todos los archivos aparte de un tipo que queremos conservar. Es un poco contradictorio, pero proporcionamos el nombre del tipo de archivo que deseamos conservar , no el nombre de los que deseamos eliminar.

La -notopción le dice findque devuelva los nombres de los archivos que no coinciden con el patrón de búsqueda. Estamos usando la  -I opción (argumentos iniciales) con xargsuna vez más. Esta vez, el token de cadena de reemplazo que estamos definiendo es «{}». Esto se comportará exactamente igual que el token de cadena de reemplazo que generamos anteriormente, que resultó ser un «%».

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

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

ls -l

Creación de un archivo de almacenamiento con Xargs

Podemos usar findpara buscar archivos y pasarlos  xargs  a tar, para crear un archivo de almacenamiento.

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

buscar ./ ​​- nombre "* .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 de almacenamiento.

El mediador de datos

A veces necesitas un pequeño andamio cuando apilas cosas juntas. xargscierra la brecha entre los comandos que pueden enviar información y los comandos que no están diseñados para recibirla.

Ambos xargsy findtienen una gran cantidad de opciones. Le recomendamos que consulte sus páginas de manual para obtener más información.

responroot

Compartir
Publicado por
responroot
Etiquetas: linux

Entradas recientes

Steamlytics: La nueva herramienta imprescindible para los gamers de Steam

  El mundo del gaming ha experimentado un crecimiento exponencial en los últimos años. La…

1 año hace

Cuándo reemplazar su antigua unidad flash USB

Stokkete/Shutterstock.com ¿Sigue utilizando una unidad flash USB obsoleta para almacenar sus archivos? ¿Por qué no…

2 años hace

¿Qué es una pantalla Nano IPS?

LG Los fabricantes siempre intentan mejorar el rendimiento de imagen de los monitores. Como resultado,…

2 años hace

10 formas de jugar con un presupuesto bajo (o nulo)

Patty Chan/Shutterstock.com Si cree en lo que ve en las redes sociales, puede pensar en…

2 años hace

¿Demasiadas suscripciones? Aquí está cómo empezar a cortarlos

Seksan.TH/Shutterstock.com Los servicios de suscripción como Netflix, Game Pass y Spotify nos permiten consumir tantas…

2 años hace

Cómo configurar la puerta de enlace predeterminada en Linux

fatmawati achmad zaenuri/Shutterstock El acceso a Internet, oa cualquier otra red, se rige por la…

2 años hace