Я знаю , що я не відповідати на 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 Theatre та 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's термінаторами ( +і\; ) полягає в тому, що +групується стільки імен файлів, які вони можуть надати в один командний рядок. Тоді як \;буде виконуватися команда для кожного імені файлу.
Так, 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".