Linux中xargs命令的使用
xargs
程序允许你从标准输入生成和执行命令,它通常通过管道与其他命令结合使用。
使用xargs,您可以提供标准输入作为命令行实用程序(例如mkdir和rm)的参数。
在本教程中,介绍使用xargs
命令的基本知识。
如何使用Linux
xargs
从标准输入读取参数,用空格或换行符分隔,并使用输入作为命令的参数执行指定的命令,如果未提供命令,则默认值为/bin/echo。
xargs
命令的语法如下所示:
xargs [OPTIONS] [COMMAND [initial-arguments]]
使用xargs
的最基本示例是使用xargs
的管道传递几个以空格分隔的字符串,并运行一个命令,这些字符串将用作参数。
echo "file1 file2 file3" | xargs touch
在上面的示例中,标准输入传递给xargs
,并为每个参数运行touch
命令,创建三个文件,这与运行以下命令相同:
touch file1 file2 file3
如何查看命令并提示用户
要在终端上打印命令,请在执行该命令之前使用-t
( --verbose
)选项:
echo "file1 file2 file3" | xargs -t touch touch file1 file2 file3
如果要获得提示是否在执行每个命令之前运行它,请使用-p
( --interactive
)选项:
echo "file1 file2 file3" | xargs -p touch
键入 y
或 n
确认并运行命令:
touch file1 file2 file3 ?...y
此选项在执行破坏性命令时很有用。
如何限制参数的数量
默认情况下,传递给命令的参数数目取决于系统的限制。
-n
( --max-args
)选项指定要传递给给定命令的参数数目,xargs
根据需要多次运行指定的命令,直到所有参数都用完,
在下面的示例中,从标准输入读取的参数数限制为1 .
echo"file1 file2 file3" | xargs -n 1 -t touch
从下面的详细输出中可以看到,每个参数分别执行touch命令:
touch file1 touch file2 touch file3
如何运行多个命令
要使用xargs
运行多个命令,请使用-I
选项,它的工作方式是在replace-str
选项之后定义一个-I
,replace-str
的所有匹配项都替换为传递给xargs的参数,
以下xargs示例将运行两个命令,首先将使用touch创建文件,然后使用ls命令列出文件:
[root@Huawei ~]# echo "file1 file2 file3" | xargs -t -I % sh -c '{ touch %; ls -l %; }' sh -c { touch file1 file2 file3; ls -l file1 file2 file3; } -rw-r--r-- 1 root root 0 Nov 16 14:22 file1 -rw-r--r-- 1 root root 0 Nov 16 14:22 file2 -rw-r--r-- 1 root root 0 Nov 16 14:22 file3
replace-str
的一个常见选择是%
,但是你可以使用另一个占位符,例如ARGS
:
echo "file1 file2 file3" | xargs -t -I ARGS sh -c '{ touch ARGS; ls -l ARGS; }'
如何指定分隔符
使用-d
( --delimiter
)选项可设置自定义分隔符,这个分隔符可以是单个字符或以。
以下示例使用;
作为分隔符:
[root@Huawei ~]# echo "file1;file2;file3" | xargs -d ';' -t touch touch file1 file2 file3 [root@Huawei ~]#
如何从文件中读取项
xargs命令还可以从文件中读取项而不是标准输入,为此,使用-a
( --arg-file
)选项后跟文件名,
在以下示例中,xargs命令将读取ips.txt文件并ping每个IP地址。
我们也使用-L 1
选项,它指示xargs
一次读取一行,如果省略此选项,xargs会将所有IP传递给单个ping命令。
xargs -t -L 1 -a ips.txt ping -c 1 ping -c 1 8.8.8.8 PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. 64 bytes from 8.8.8.8: icmp_seq=1 ttl=50 time=68.1 ms ... ping -c 1 1.1.1.1 PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data. 64 bytes from 1.1.1.1: icmp_seq=1 ttl=59 time=21.4 ms
在find
中使用xargs
xargs最常与find命令结合使用。可以使用find
搜索特定文件,然后使用xargs
对这些文件执行操作。
为了避免包含换行符或其他特殊字符的文件名出现问题,请始终使用find -print0
选项,该选项使find
打印空字符后跟,xargs
使用-0
,( --null
)选项可以正确解释此输出。
在下面的示例中,find将显示/var/www/.cache目录中所有文件的全名,xargs会将文件路径传递给rm命令:
find /var/www/.cache -type f -print0 | xargs -0 rm -f
使用xargs修剪空白字符
xargs
还可以用作从给定字符串的两侧删除空白的工具,只需将字符串通过管道传递给xargs
命令,它就可以进行修剪:
echo" Long line" | xargs Long line
这在比较shell脚本中的字符串时很有用。
#!/bin/bash VAR1=" Linuxize" VAR2="Linuxize" if [[ "$VAR1" == "$VAR2" ]]; then echo "Strings are equal." else echo "Strings are not equal." fi ## Using xargs to trim VAR1 if [[ $(echo "$VAR1" | xargs) == "$VAR2" ]]; then echo "Strings are equal." else echo "Strings are not equal." fi
Strings are not equal. Strings are equal.