基础用法

xargs 指令默认情况下从 stdin 中读取信息,按照空格分或换行区分开,并且执行输入的命令(默认的命令是 /bin/echo )。命令可以通过 xargs 的参数指定执行一次或多次,命令的执行参数为自身初始参数追加上由 stdin 读到的内容,命令在执行时会忽略空行。

xargs reads items from the standard input, delimited by blanks (which can be protected with double or single quotes or a backslash) or newlines, and executes the command (default is /bin/echo) one or more times with any initial-arguments followed by items read from standard input. Blank lines on the standard input are ignored.

在命令行输入 xargs 命令,输入 “a b c d” 后按回车,再按 ctrl+d 完成本次输入,则 xargs 的默认 echo 命令会将接收到的字符串打印出来,效果如下所示。

# xargs
a b c d
a b c d

xargs 单独使用时功能比较单一,但是它与其他指令一起使用十分强大。

xargsfind 组合使用

常见的使用方法是使用 find 指令找到指定的文件,组合以 xargs 指令实现对指定文件的操作。

find . -name "demo_" | xargs file -i

由于 xargs 是使用空格作为各个参数的分隔符,如果遇到的文件名中含有空格,则并不能按照预期处理。这时,可以使用 find 指令的 -print0 将含有空格的文件名转化为字符串,再结合 xargs-0 参数就能完成文件名中含有空格的处理,改进后的命令如下。

find . -name "demo_" -print0 | xargs -0 file -i

xargsgrep 组合使用

常用命令如下,能够实现对指定规则文件的搜索匹配。

find . -name "*.log" | xargs grep error

使用 -n 参数让 xargs 的命令重复执行

如果想用 find 指令完成多个匹配规则的搜索,则可以使用 -n 参数将 xargs 的内容分割成多个。
下面的命令会执行3次 find 命令, xargs 会将接收的到的内容按照单词数为“1”分割,分3次传送给 find 指令。

echo "*.c" "*.cpp" "*.h" | xargs -n 1 find . -name

使用 -t 参数让 xargs 打印将要执行的命令

xargs 将指令的命令打印出来主要是方便查看命令执行情况,也方便在出现错误时进行调试。

find . -name *.log | xargs -t rm -f

使用 -p 参数让 xargs 在执行命令前询问用户

增加 -p 参数后, xargs 在每次执行命令前会将指令打印出来并询问用户,只有用户输入 “y” 时才会真正执行该条命令。

echo "*.c" "*.cpp" "*.h" | xargs -n 1 -p find . -name

使用 -I 参数让 xargs 进行参数替换

xargs 默认会将读取到的内容追加在指令命令后面作为参数,使用 -I 参数能够控制命令参数的组合方式。
以下命令会将当前目录中的可执行文件移动到bin文件夹下。

find . -executable -type f -print0 | xargs -0 -I {} mv {} ./bin