Я знаю, что не отвечаю на xargs
вопрос напрямую, но стоит упомянуть вариант find
-exec
.
Учитывая следующую файловую систему:
[root@localhost bokeh]# tree --charset assci bands
bands
|-- Dream\ Theater
|-- King's\ X
|-- Megadeth
`-- Rush
0 directories, 4 files
Команда find может использоваться для обработки пространства в Dream Theater и King's X. Итак, чтобы найти барабанщиков каждой группы с помощью 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
В параметре -exec
{}
обозначает имя файла, включая путь. Обратите внимание, что вам не нужно его избегать или заключать в кавычки.
Разница между терминаторами -exec
(+
и \;
) в том, что +
группирует столько имен файлов, сколько может, в одной командной строке. В то время как \;
выполнит команду для каждого имени файла.
Итак, find bands/ -type f -exec grep Drums {} +
приведет к:
grep Drums "bands/Dream Theater" "bands/Rush" "bands/King's X" "bands/Megadeth"
и find bands/ -type f -exec grep Drums {} \;
приведет к:
grep Drums "bands/Dream Theater"
grep Drums "bands/Rush"
grep Drums "bands/King's X"
grep Drums "bands/Megadeth"
В случае grep
это имеет побочный эффект: либо печатается имя файла, либо нет.
[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
Конечно, параметры grep
-h
и -H
будут определять, будет ли напечатано имя файла независимо от того, как вызывается grep
.
xargs
xargs
также может управлять размещением файлов man в командной строке.
xargs
по умолчанию группирует все аргументы в одну строку. Чтобы сделать то же самое, что -exec \;
использует xargs -l
. Обратите внимание, что опция -t
указывает xargs
напечатать команду перед ее выполнением.
[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
Обратите внимание, что параметр -l
указывает xargs выполнять команду grep для каждого имени файла.
По сравнению со значением по умолчанию (т.е. без опции -l
):
[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
лучше контролирует, сколько файлов может быть в командной строке. Задайте для параметра -l
максимальное количество файлов на команду.
[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]#
Обратите внимание, что grep
был выполнен с двумя именами файлов из-за -l2
.
person
shrewmouse
schedule
11.08.2017
ls |grep mp3 |sed -n "7p"
вы можете просто использоватьecho "Lemon Tree.mp3"
. - person Micha Wiedenmann   schedule 26.05.2013