2009-12-23 7 views
9

Ich möchte wissen, wie ich die von xargs erzeugten Befehle an den Hintergrund senden kann. Betrachten wir zum BeispielSenden der von xargs erzeugten Befehle an den Hintergrund

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

Ich versuchte

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

.. und so unerwartet, wie es scheint, statt xargs in den Hintergrund zu schicken?

Wie stelle ich jede Instanz des Befehls compress in den Hintergrund?

Antwort

5

Für SunOS Sie einen Blick auf GNU http://www.gnu.org/software/parallel/

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

Es hat den zusätzlichen Vorteil, nicht scheißen, wenn der Dateiname ' "oder Leerzeichen enthält. Das Hinzufügen -j + 0 machen führen sie es eine Kompresse pro CPU-Kern

6

Sie könnten wahrscheinlich ein sehr schnelles Shellscript erstellen, um compress aufzurufen.

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

dann

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

Obwohl ich glaube, Sie könnten glücklicher sein mit diesem xargs Argument:

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

Dieser Befehl finden sollte/tee/komprimieren 10 Dateien zu einer Zeit, bis seine getan und gibt die Kontrolle sofort an das aufrufende Skript/Shell zurück.

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

Die UNIX Ich habe ($ uname -a SunOS xxx 5.10 Generic_xx7xx1- 06 sun4u sparc SUNW, Sonne-Feuer) hat nicht -P ($ xargs -P xargs: illegale Option - P xargs: Verwendung: xargs: [-t] [-p] [-e [eofstr]] [ -E eofstr] [-I replstr] [-i [replstr]] [-L #] [-l [#]] [-n # [-x]] [-s Größe] [cmd [args ...] ]) Alle anderen Alternativen als die Shell-Skript-Wrapper? – PoorLuzer

+1

Sorry, ich kann nicht viel für SunOS finden - obwohl ich dieses Paket "xjobs" gefunden habe, das Sie vielleicht kompilieren könnten ... http://www.maier-komor.de/xjobs.html – gnarf

2

Dies funktioniert für mich, wenn ich alle Dateien bearbeiten möchten, das foo

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

9

Verwenden Sie die Option --max-procs/-P, um Xargs-Ziele im Hintergrund auszuführen. Aus der Manpage von GNU xargs Version 4.2.27:

--max-Procs = max-Procs, -P max-Procs

Führen Sie bis zu max-Procs Prozessen zu einem Zeitpunkt; Der Standardwert ist 1. Wenn max-procs 0 ist, werden xargs so viele Prozesse wie möglich gleichzeitig ausführen. Verwenden Sie die Option -n mit -P; Ansonsten besteht die Möglichkeit, dass nur eine Exekutive ausgeführt wird.

(Vielleicht möchten Sie dies mit -n 1 kombinieren, um sicherstellt, dass es ein neues Verfahren ist für jede Datei, die Sie komprimieren möchten)

+0

(Hmm, habe gerade gemerkt, dass meine Antwort ein Duplikat der zweiten Hälfte von gnarfs Antwort ist, die ich nach dem einleitenden Kommentar über das Schreiben eines Shell-Skripts nicht gelesen habe. Ich werde meine Antwort hier lassen, falls andere auch überfliegen gnarf Antwort wie ich es getan habe) – RobM