我知道我没有直接回答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]#
看到由于-l2,grep 使用两个文件名执行。