xargs 命令详解

| 选择喜欢的代码风格  

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

xargs 命令安装:


-bash: xargs: command not found

#Debian
apt-get install findutils

#Ubuntu
apt-get install findutils

#Alpine
apk add findutils

#Arch Linux
pacman -S findutils

#Kali Linux
apt-get install findutils

#Fedora
dnf install findutils-1
 
#OS X
brew install findutils

#Raspbian
apt-get install findutils

#Docker
docker run cmd.cat/xargs xargs

xargs 命令补充说明:


xargs 从标准输入中读取由空格(可以用双引号或单引号或反斜杠保护)或换行符分隔的项目,并执行一次(多次命令)(默认命令为 echo,位于 /bin/echo)带有任何初始参数,后跟从标准输入读取的项目。标准输入上的空白行将被忽略。

因为 Unix 文件名可以包含空格和换行符,所以这种默认行为经常会出现问题。 xargs 错误地处理了包含空格或换行符的文件名。在这些情况下,最好使用 -0 选项(这是零,而不是大写的 o),这样可以防止出现此类问题。使用此选项时,您将需要确保为 xargs 生成输入的程序还将空字符用作分隔符。例如,如果找到该程序,则 -print0 选项为您执行此操作。

如果以状态 255 退出命令的任何调用,则 xargs 将立即停止,而无需读取任何其他输入。发生这种情况时,将在 stderr 上发出错误消息。

xargs 命令语法:


xargs [-0prtx] [-E eof-str] [-e[eof-str]] [--eof[=eof-str]] [--null] 
      [-d delimiter] [--delimiter delimiter] [-I replace-str] 
      [-i[replace-str]] [--replace[=replace-str]] [-l[max-lines]] 
      [-L max-lines] [--max-lines[=max-lines]] [-n max-args] 
      [--max-args=max-args] [-s max-chars] [--max-chars=max-chars] 
      [-P max-procs] [--max-procs=max-procs] [--interactive] [--verbose] 
      [--exit] [--no-run-if-empty] [--arg-file=file] [--show-limits] 
      [--version] [--help] [command [initial-arguments]]

xargs 命令选项:


--arg-file=file, -a file  从文件而不是标准输入中读取项目。 如果使用此选项,则在运行命令时stdin保持不变。 否则,将从 /dev/null 重定向stdin。
--null, -0  输入项目以空字符而不是空格终止,并且引号和反斜杠不是特殊的(每个字符均按字面意义使用)。 禁用文件尾字符串,该字符串与其他任何参数一样对待。 输入项可能包含空格,引号或反斜杠时很有用。 find -print0 选项产生适用于此模式的输入。
--delimiter=delim, -d delim 输入项目以指定字符终止。 引号和反斜杠并不特殊; 输入中的每个字符均按字面意义使用。 禁用文件尾字符串,该字符串与其他任何参数一样对待。 当输入由换行符分隔的项目组成时,可以使用此方法,尽管在可能的情况下,最好将程序设计为使用--null。 指定的分隔符可以是单个字符,C样式字符转义符(例如\ n)或八进制或十六进制转义码。 八进制和十六进制转义码被理解为printf命令。 不支持多字节字符。
-E eof-str  将文件结尾字符串设置为eof-str。 如果文件结尾字符串作为输入行出现,则其余输入将被忽略。 如果既不使用-E也不使用-e,则不使用文件结尾字符串。
--eof [= eof-str],-e [eof-str]此选项是-E选项的同义词。 请改用-E,因为它与POSIX兼容,而该选项不兼容。 如果省略eof-str,则没有文件结尾字符串。 如果既不使用-E也不使用-e,则不使用文件结尾字符串。
--help  显示概述xargs选项的帮助消息,然后退出。
-I replace-str  将初始参数中出现的replace-str替换为从标准输入中读取的名称。 同样,未加引号的空格也不会终止输入项目。 相反,分隔符是换行符。 表示-x和-L 1。
--replace[=replace-str], -i[replace-str]  如果指定了replace-str,则此选项是-Ireplace-str的同义词,否则是-I {}的同义词。 不建议使用此选项; 使用-I代替。
-L max-lines  每个命令行最多使用最大行数非空白输入行。 尾随空白会导致输入行在逻辑上在下一条输入行上继续。 表示-x。
--max-lines[=max-lines], -l[max-lines]  -L选项的同义词。 与-L不同,max-lines参数是可选的。 如果未指定max-lines,则默认为1。 不建议使用-l选项,因为POSIX标准改为指定-L。
--max-args=max-args, -n max-args  每个命令行最多使用max-args参数。 如果超出大小(请参阅-s选项),则使用少于max-args参数,除非给出了-x选项,在这种情况下xargs将退出。
--interactive, -p 提示用户是否运行每个命令行并从终端读取一行。 如果响应以“ y”或“ Y”开头,则仅运行命令行。 表示-t。
--max-chars=max-chars, -s max-chars 每个命令行最多使用最大字符数字符,包括命令和初始参数以及参数字符串末尾的终止null。 允许的最大值取决于系统,并且被计算为exec的参数长度限制,环境的大小,2048个字节的净空。 如果此值大于128 KiB,则将128 Kib用作默认值;否则,将使用默认值。 否则,默认值为最大值。 1 KiB是1024字节。
--verbose, -t 执行之前,在标准错误输出上打印命令行。
--version 打印xargs的版本号,然后退出。
--show-limits 显示由操作系统,xargs选择的缓冲区大小和-s选项所施加的命令行长度限制。 如果您不希望xargs做任何事情,请通过管道从/dev/null输入输入(并可能指定--no-run-if-empty)。
--exit, -x  如果超出大小(请参阅-s选项),请退出。
--max-procs=max-procs, -P max-procs 一次运行max-procs进程; 默认值为1。如果max-procs为0,则xargs一次将运行尽可能多的进程。 将-n选项与-P一起使用; 否则,只有一名高管会被执行。

xargs 命令有以下几个退出状态:


状态 描述
0 成功
123 该命令的部分调用返回了1到125之间的状态。
124 该命令以状态255退出。
125 该命令被信号杀死。
126 该命令无法运行。
127 找不到命令。
1 发生了另一种错误。

xargs 命令实例


在目录 /tmp 中或目录以下查找名为 core 的文件并将其删除。 请注意,如果有任何包含换行符或空格的文件名,这将无法正常工作

find /tmp -name core -type f -print | xargs /bin/rm -f

/tmp 目录下或目录下查找名为 core 的文件,然后删除它们,以正确处理包含空格或换行符的文件或目录名称的方式处理文件名

find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f

在目录 /tmp 中或以下查找名为 core 的文件并删除它们,但是比上一个示例更有效(因为我们避免了需要使用 forkexec rm,并且不需要额外的 xargs 进程):

find /tmp -depth -name core -type f -delete

使用 cut 命令生成系统上所有用户的紧凑列表:

cut -d: -f1 < /etc/passwd | sort | xargs echo

通过使用 -I 标志,可以使用 xargs 运行多个命令。 这用传递给 xargs 的参数替换了参数的出现。 以下回显字符串并创建一个文件夹:

cat foo.txt
one
two
three

cat foo.txt | xargs -I % sh -c 'echo %; mkdir %'
one 
two
three

ls 
one two three

xargs 其他示例:

#使用 -d 分割输入
#-d 选项 可以自定义一个定界符:
$ echo "nameXnameXnameXname" | xargs -dX

name name name name

#结合 -n 选项 使用:
echo "nameXnameXnameXname" | xargs -dX -n2

name name
name name

#假如你有一个文件包含了很多你希望下载的 URL,你能够使用 xargs 下载所有链接:
cat url-list.txt | xargs wget -c

xargs 命令扩展阅读:




xargs 命令评论