Wiem, że nie odpowiadam xargs
bezpośrednio na pytanie, ale warto wspomnieć find
o -exec
opcji.
Biorąc pod uwagę następujący system plików:
[root@localhost bokeh]# tree --charset assci bands
bands
|-- Dream\ Theater
|-- King's\ X
|-- Megadeth
`-- Rush
0 directories, 4 files
Polecenie find można wykonać, aby obsłużyć przestrzeń w Dream Theatre i King's X. Aby znaleźć perkusistów każdego zespołu za pomocą grep:
[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
W -exec
opcji {}
oznacza nazwę pliku wraz ze ścieżką. Pamiętaj, że nie musisz uciekać od niego ani umieszczać go w cudzysłowie.
Różnica między -exec
terminatorami ( +
i \;
) polega na tym +
, że grupuje jak najwięcej nazw plików w jednym wierszu poleceń. Natomiast \;
wykona polecenie dla każdej nazwy pliku.
Tak, find bands/ -type f -exec grep Drums {} +
spowoduje:
grep Drums "bands/Dream Theater" "bands/Rush" "bands/King's X" "bands/Megadeth"
i find bands/ -type f -exec grep Drums {} \;
spowoduje:
grep Drums "bands/Dream Theater"
grep Drums "bands/Rush"
grep Drums "bands/King's X"
grep Drums "bands/Megadeth"
W takim przypadku grep
efektem ubocznym jest wydrukowanie nazwy pliku lub nie.
[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
Oczywiście, grep
opcje -h
i -H
będą kontrolować, czy nazwa pliku jest drukowana, niezależnie od tego, jak grep
zostanie wywołana.
xargs
xargs
może również kontrolować, jak pliki man są w wierszu poleceń.
xargs
domyślnie grupuje wszystkie argumenty w jednym wierszu. Aby zrobić to samo, -exec \;
co używa xargs -l
. Zauważ, że -t
opcja nakazuje xargs
wydrukowanie polecenia przed jego wykonaniem.
[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
Zobacz, że -l
opcja mówi xargsowi, aby wykonał grep dla każdej nazwy pliku.
W porównaniu do wartości domyślnej (tj. Brak -l
opcji):
[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
ma lepszą kontrolę nad liczbą plików w wierszu poleceń. Podaj -l
opcję maksymalnej liczby plików na polecenie.
[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]#
Zobacz, że grep
zostało wykonane z dwoma nazwami plików z powodu -l2
.
ls |grep mp3 |sed -n "7p"
ciebie możesz po prostu użyćecho "Lemon Tree.mp3"
.