Я знаю , что я не отвечать на xargs
вопрос прямо , но это стоит отметить find
«s -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
.
ls |grep mp3 |sed -n "7p"
тебя можно просто использоватьecho "Lemon Tree.mp3"
.