Uso de xargs: Herramientas UNIX (II)
En el momento que empezamos a tratar con directorios con una gran cantidad de archivos en el empezamos a ver como realmente funcionan las cosas y la gran utilidad de xargs. Vamos a ver unos ejemplos…
Suponiendo que tenemos en un directorio muchos archivos y queremos borrarlos, normalmente ejecutaríamos:
# rm -fr *
Esto bash lo transforma en lo siguiente y lo ejecuta:
# rm -fr file1 file2 file3 file 4 ..........
Transforma la expresión “*” en una lista de todos los ficheros que cumplen tal expresión. Evidentemente, al ser la lista tan larga no cabe en el buffer reservado al comando a ejecutar (todo tiene un límite).
Gracias a xargs podemos ejecutar el comando de la siguiente manera:
ls | xargs rm -fr
Esto lanzaría un proceso rm para cada fichero del directorio. Tenemos otras opciones disponibles que nos pueden ser útiles:
- -t: Nos permite ver el comando antes de ejecutarlo:
# ls | xargs -t echo echo ipp.txt openvpn-status.log run supervise ipp.txt openvpn-status.log run supervise
- -n: Permite definir el número de argumentos que vemos a pasar a cada comando, por ejemplo:
# ls | xargs -n2 echo ipp.txt openvpn-status.log run supervise
- -I: Permite definir donde se van a definir los parámetros, por ejemplo:
# ls | xargs -I ARG echo antes ARG despues antes ipp.txt despues antes openvpn-status.log despues antes run despues antes supervise despues
- -P: Permite definir el número de procesos paralelos a lanzar al mismo tiempo. Mediante esta opción podemos usar xargs como un gestor de threads. Por ejemplo, si lanzamos el siguiente comando:
# ls | xargs -I ARG -P4 -n1 sleep 4
Podremos ver en la lista de procesos lo siguiente:
root 4687 0.0 0.0 59132 540 pts/0 S 08:25 0:00 \_ xargs -I ARG -P4 -n1 sleep 4 root 4688 0.0 0.0 58864 508 pts/0 S 08:25 0:00 | \_ sleep 4 root 4690 0.0 0.0 58864 508 pts/0 S 08:25 0:00 | \_ sleep 4 root 4691 0.0 0.0 58864 508 pts/0 S 08:25 0:00 | \_ sleep 4 root 4692 0.0 0.0 58864 508 pts/0 S 08:25 0:00 | \_ sleep 4
Relacionados
Imprimir
23. April 2009 at 2:29 pm :
Antes de nada decirte que enhorabuena por el blog y que esta muy bien
En este post dices:
Gracias a xargs podemos ejecutar el comando de la siguiente manera:
ls | xargs rm -fr
Esto lanzaría un proceso rm para cada fichero del directorio. Tenemos otras opciones disponibles que nos pueden ser útiles:
Para tener un proceso para cada fichero no sería así:
ls | xargs -n1 rm -frNo hay preview así que no se como quedará esto
admin:
Esto lo que haría sería equivalente a:
Le estas indicando que quieres lanzar un rm con un solo parámetro.
Suponiendo unos ficheros sería:
Al usar n4 sería:
27. April 2009 at 10:42 am :
Hola de nuevo,
Mi duda venía por que para ver que pasa cuando ejecuto
$ ls | xargs rm -rf
añado la opción -t, como tu indicas, y la respuesta es:
$ ls | xargs -t rm -rf
rm -rf fichero1 fichero2 fichero3 fichero4 fichero5
Gracias por responder
2. October 2009 at 9:06 am :
Buen día,
Tengo un fichero plano con un registro de 6 posiciones, que es el código de artículo.
A partir de ese fichero necesito generar uno nuevo pero en sentido inverso.
Ejemplo:
000001
000002
000003
000004
000005
000006
000007
Y quiero generar uno nuevo con la opción -n2
y queda asi:
000001 000002
000003 000004
000005 000006
000007 000007
………. ……….
Hasta aqui todo ok. pero hoy necesite queu n archivo con 21.000 registro quede agrupado en 1000 columnas.
Lo máximo que me generó fueron 290 columnas.
El Xargs con la opción -n tiene limite?
Gracias !!!
Jordi Prats:
No entiendo para que quieres usar xargs para hacer esto. Para realizar lo que comentas puedes usar paste:
2. December 2009 at 10:02 am :
Para borrar grandes cantidades de ficheros también se puede usar la siguiente expresión:
find . -name “*” -exec rm -rf {} \;
Saludos