2009-12-23 11 views
9

Deseo saber cómo puedo enviar los comandos generados por xargs al fondo. Por ejemplo, considereEnvío de los comandos generados por xargs al fondo

find . -type f -mtime +7 | tee compressedP.list | xargs compress 

me trataron

find . -type f -mtime +7 | tee compressedP.list | xargs -i{} compress {} & 

.. y tan inesperado, que parece enviar xargs a un segundo plano en su lugar?

¿Cómo hago para que cada instancia del comando compress vaya al fondo?

Respuesta

5

Para SunOS puede echar un vistazo a GNU paralelo http://www.gnu.org/software/parallel/

find . -type f -mtime +7 | tee compressedP.list | parallel compress 

tiene la ventaja añadida de no crapping si el nombre de archivo contiene ' "o espacio. Añadiendo -j + 0 hará que se ejecute una compresa por núcleo de CPU

6

Probablemente pueda hacer un shellscript muy rápido para llamar a compress.

#!/bin/sh 
# call it 'compbg' and chmod a+x 
compress $* & 

continuación

find . -type f -mtime +7 | tee compressedP.list | xargs -I{} compbg {} 

Aunque creo que podría ser más feliz que utiliza este xargs argumento:

-P maxprocs 
     Parallel mode: run at most maxprocs invocations of utility at once. 

Este comando debe buscar/camiseta/comprimir 10 archivos a la vez hasta que su hecho , así como devolver el control inmediatamente al script/shell de llamada.

find . -type f -mtime +7 | tee compressedP.list | xargs -I{} -P10 compress {} & 
+0

La UNIX que tengo ($ uname -a SunOS xxx 5.10 Generic_xx7xx1- 06 sun4u sparc SUNW, Sun-Fire) no tiene -P ($ xargs -P xargs: opción ilegal - P xargs: Uso: xargs: [-t] [-p] [-e [eofstr]] [ -Eofstr] [-I replstr] [-i [replstr]] [-L #] [-l [#]] [-n # [-x]] [-s size] [cmd [args ...] ]) ¿Alguna otra alternativa que el envoltorio de script de shell? – PoorLuzer

+1

Lo siento, no puedo encontrar mucho para SunOS, aunque sí encontré este paquete "xjobs" que podría compilar ... http://www.maier-komor.de/xjobs.html – gnarf

2

Esto funciona para mí cuando quiero editar todos los archivos que contienen foo

grep foo -rl ./. | `xargs emacs` &

9

Utilice la opción --max-procs/-P para ejecutar objetivos xargs en segundo plano. Desde la página del manual de GNU xargs versión 4.2.27:

--max-procs = max-procs, -P max-procs

Ejecutar hasta procesos max-procs a la vez; el valor predeterminado es 1. Si max-procs es 0, xargs ejecutará tantos procesos como sea posible a la vez. Use la opción -n con -P; de lo contrario, es probable que solo se realice un ejecutivo.

(Es posible que desee combinar esto con -n 1 que se asegura de que hay un nuevo proceso para cada archivo que desea comprimir)

+0

(Hmm, acabo de darme cuenta de que mi respuesta es un duplicado de la segunda mitad de la respuesta de gnarf, que no leí después del comentario inicial sobre la escritura de un guión. Dejaré mi respuesta aquí en caso de que otros también pasen desapercibidos la respuesta de Gnarf como lo hice yo) – RobM

Cuestiones relacionadas