Я знаю , що я не відповідати на 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"
.