Ich weiß, dass ich die Frage zu xargs
nicht direkt beantworte, aber es lohnt sich, die Option -exec
von find
zu erwähnen.
Angenommen, das folgende Dateisystem:
[root@localhost bokeh]# tree --charset assci bands
bands
|-- Dream\ Theater
|-- King's\ X
|-- Megadeth
`-- Rush
0 directories, 4 files
Der find
-Befehl kann so angepasst werden, dass er mit den Leerzeichen in Dream Theater und King's X umgeht. Also, um die Schlagzeuger jeder Band mit grep zu finden:
[root@localhost]# find bands/ -type f -exec grep Drums {} +
bands/Dream Theater:Drums:Mike Mangini
bands/Rush:Drums: Neil Peart
bands/King's X:Drums:Jerry Gaskill
bands/Megadeth:Drums:Dirk Verbeuren
In der -exec
-Option steht {}
für den Dateinamen inklusive Pfad. Beachten Sie, dass Sie es nicht escapen oder in Anführungszeichen setzen müssen.
Der Unterschied zwischen den Terminatoren von -exec
(+
und ;
) besteht darin, dass +
so viele Dateinamen wie möglich zu einer Befehlszeile zusammenfasst. Während ;
den Befehl für jeden Dateinamen ausführt.
Also wird find bands/ -type f -exec grep Drums {} +
zu folgendem führen:
grep Drums "bands/Dream Theater" "bands/Rush" "bands/King's X" "bands/Megadeth"
und find bands/ -type f -exec grep Drums {} \;
wird zu folgendem führen:
grep Drums "bands/Dream Theater"
grep Drums "bands/Rush"
grep Drums "bands/King's X"
grep Drums "bands/Megadeth"
Im Falle von grep
hat dies den Nebeneffekt, entweder den Dateinamen auszudrucken oder nicht.
[root@localhost bokeh]# find bands/ -type f -exec grep Drums {} \;
Drums:Mike Mangini
Drums: Neil Peart
Drums:Jerry Gaskill
Drums:Dirk Verbeuren
[root@localhost bokeh]# find bands/ -type f -exec grep Drums {} +
bands/Dream Theater:Drums:Mike Mangini
bands/Rush:Drums: Neil Peart
bands/King's X:Drums:Jerry Gaskill
bands/Megadeth:Drums:Dirk Verbeuren
Natürlich kontrollieren grep
's Optionen -h
und -H
, ob der Dateiname unabhängig davon gedruckt wird, wie grep
aufgerufen wird.
xargs
xargs
kann auch steuern, wie viele Dateien auf der Befehlszeile sind.
xargs
gruppiert standardmäßig alle Argumente in eine Zeile. Um dasselbe zu erreichen, was -exec \;
tut, verwenden Sie xargs -l
. Beachten Sie, dass die Option -t
xargs
sagt, den Befehl vor der Ausführung zu drucken.
[root@localhost bokeh]# find ./bands -type f | xargs -d '\n' -l -t grep Drums
grep Drums ./bands/Dream Theater
Drums:Mike Mangini
grep Drums ./bands/Rush
Drums: Neil Peart
grep Drums ./bands/King's X
Drums:Jerry Gaskill
grep Drums ./bands/Megadeth
Drums:Dirk Verbeuren
Beachten Sie, dass die Option -l
xargs sagt, grep für jeden Dateinamen auszuführen.
Im Vergleich zum Standard (also keine -l
-Option):
[root@localhost bokeh]# find ./bands -type f | xargs -d '\n' -t grep Drums
grep Drums ./bands/Dream Theater ./bands/Rush ./bands/King's X ./bands/Megadeth
./bands/Dream Theater:Drums:Mike Mangini
./bands/Rush:Drums: Neil Peart
./bands/King's X:Drums:Jerry Gaskill
./bands/Megadeth:Drums:Dirk Verbeuren
xargs
bietet eine bessere Kontrolle darüber, wie viele Dateien auf der Befehlszeile stehen können. Mit der Option -l
geben Sie die maximale Anzahl von Dateien pro Befehl an.
[root@localhost bokeh]# find ./bands -type f | xargs -d '\n' -l2 -t grep Drums
grep Drums ./bands/Dream Theater ./bands/Rush
./bands/Dream Theater:Drums:Mike Mangini
./bands/Rush:Drums: Neil Peart
grep Drums ./bands/King's X ./bands/Megadeth
./bands/King's X:Drums:Jerry Gaskill
./bands/Megadeth:Drums:Dirk Verbeuren
[root@localhost bokeh]#
Beachten Sie, dass grep
mit zwei Dateinamen ausgeführt wurde, aufgrund von -l2
.