xargs
是 Linux 中一个强大的命令行工具,常用于将标准输入或命令的输出转换为命令参数。它允许我们将输出数据作为参数传递给其他命令,尤其适合处理需要大量参数的命令。
xargs
的基本语法xargs [选项] [命令]
xargs
的行为,比如 -n
、-d
等。echo
。-n
:指定每次传递给命令的参数个数。-d
:自定义分隔符,默认是空白字符。-I {}
:指定占位符,xargs
会将 {}
替换为输入数据。-p
:执行每个命令前提示用户确认。-0
:以 null 字符(\0)作为输入分隔符,常用于处理文件名中有空格的情况。xargs
使用场景xargs
最常见的用途是将输出结果传递给其他命令。例如,假设你有一个包含文件列表的文本文件 filelist.txt
,你可以将文件名传递给 rm
命令来删除这些文件:
cat filelist.txt | xargs rm
上面的命令将文件列表作为参数传递给 rm
,并删除这些文件。
假设想删除当前目录下所有以 .log
结尾的文件:
find . -name "*.log" | xargs rm
find
命令会输出所有符合条件的文件路径,xargs
将这些文件路径传递给 rm
命令进行删除。
xargs
最常见的用法是和find
命令一起用。使用find
来查找文件夹中的文件,使用xargs
来操作结果,通常用来删文件或更改文件的属性。
下面命令是删除两个星期外都没有被更改过的文件。
find /tmp -mtime +14 | xargs rm
find和时间相关的参数:
Numeric arguments can be specified as
+n for greater than n,
-n for less than n,
n for exactly n.
-mtime n
File's data was last modified n*24 hours ago. See the comments for
-atime to understand how rounding affects the interpretation of
file modification times.
-atime n
File was last accessed n*24 hours ago. When find figures out
how many 24-hour periods ago the file was last accessed, any
fractional part is ignored, so to match -atime +1, a file has to have
been accessed at least two days ago.
默认情况下,xargs
会尽量多地将数据传递给命令。使用 -n
选项可以指定每次传递的参数数量。例如,每次只传递一个文件名:
cat filelist.txt | xargs -n 1 rm
每次传递一个文件名给 rm
命令,逐个删除文件。
{}
有时需要在命令的不同位置插入参数,这时可以使用 -I
选项定义一个占位符。假设想将多个文件拷贝到另一个目录:
cat filelist.txt | xargs -I {} cp {} /backup/
xargs
会将 {}
替换为文件列表中的每个文件名,执行 cp
命令,将文件复制到 /backup/
目录。
当文件名包含空格时,xargs
的默认行为可能会出错。可以使用 -0
选项结合 find
的 -print0
选项,正确处理包含空格的文件名:
find . -name "*.log" -print0 | xargs -0 rm
-print0
将文件名以 null 字符分隔,xargs -0
会识别这些 null 字符,从而正确处理文件名中包含空格的情况。
使用 -p
选项可以在执行每条命令之前提示用户确认:
cat filelist.txt | xargs -p rm
在每次删除文件之前,xargs
会提示你确认是否执行该命令。
默认情况下,xargs
使用空白字符(空格、制表符、换行符)作为输入分隔符。如果数据使用其他字符分隔,可以使用 -d
选项指定分隔符。假设文件内容以逗号分隔:
echo "file1,file2,file3" | xargs -d',' rm
这里的 xargs -d','
将逗号作为分隔符,将文件名逐个传递给 rm
命令。
假设有大量参数需要传递给一个命令,你可以使用 -L
限制每次 xargs
执行的命令行次数。例如,将每两行作为一次执行:
cat filelist.txt | xargs -L 2 echo
xargs
将每两行文件名传递给 echo
命令一次。
删除文件:
find . -name "*.tmp" | xargs rm
复制文件:
ls *.txt | xargs -I {} cp {} /backup/
压缩多个文件:
find . -name "*.log" | xargs tar -cvf logs.tar