Wiem, że nie odpowiadam xargsbezpośrednio na pytanie, ale warto wspomnieć findo -execopcji.
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 -execopcji {}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 -execterminatorami ( +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 grepefektem 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, grepopcje -hi -Hbędą kontrolować, czy nazwa pliku jest drukowana, niezależnie od tego, jak grepzostanie wywołana.
xargs
xargs może również kontrolować, jak pliki man są w wierszu poleceń.
xargsdomyślnie grupuje wszystkie argumenty w jednym wierszu. Aby zrobić to samo, -exec \;co używa xargs -l. Zauważ, że -topcja nakazuje xargswydrukowanie 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 -lopcja mówi xargsowi, aby wykonał grep dla każdej nazwy pliku.
W porównaniu do wartości domyślnej (tj. Brak -lopcji):
[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
xargsma lepszą kontrolę nad liczbą plików w wierszu poleceń. Podaj -lopcję 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 grepzostał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".