xargs命令

xargs 是 Linux 中一个强大的命令行工具,常用于将标准输入或命令的输出转换为命令参数。它允许我们将输出数据作为参数传递给其他命令,尤其适合处理需要大量参数的命令。

xargs 的基本语法

xargs [选项] [命令]
  • 选项:指定 xargs 的行为,比如 -n-d 等。
  • 命令:可选,指定将数据传递给哪个命令。如果不指定命令,默认是 echo

常见选项

  • -n:指定每次传递给命令的参数个数。
  • -d:自定义分隔符,默认是空白字符。
  • -I {}:指定占位符,xargs 会将 {} 替换为输入数据。
  • -p:执行每个命令前提示用户确认。
  • -0:以 null 字符(\0)作为输入分隔符,常用于处理文件名中有空格的情况。

常见的 xargs 使用场景

1. 传递多个参数给命令

xargs 最常见的用途是将输出结果传递给其他命令。例如,假设你有一个包含文件列表的文本文件 filelist.txt,你可以将文件名传递给 rm 命令来删除这些文件:

cat filelist.txt | xargs rm

上面的命令将文件列表作为参数传递给 rm,并删除这些文件。

2. 处理命令输出

假设想删除当前目录下所有以 .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.

3. 指定每次传递的参数个数

默认情况下,xargs 会尽量多地将数据传递给命令。使用 -n 选项可以指定每次传递的参数数量。例如,每次只传递一个文件名:

cat filelist.txt | xargs -n 1 rm

每次传递一个文件名给 rm 命令,逐个删除文件。

4. 使用占位符 {}

有时需要在命令的不同位置插入参数,这时可以使用 -I 选项定义一个占位符。假设想将多个文件拷贝到另一个目录:

cat filelist.txt | xargs -I {} cp {} /backup/

xargs 会将 {} 替换为文件列表中的每个文件名,执行 cp 命令,将文件复制到 /backup/ 目录。

5. 处理包含空格的文件名

当文件名包含空格时,xargs 的默认行为可能会出错。可以使用 -0 选项结合 find-print0 选项,正确处理包含空格的文件名:

find . -name "*.log" -print0 | xargs -0 rm

-print0 将文件名以 null 字符分隔,xargs -0 会识别这些 null 字符,从而正确处理文件名中包含空格的情况。

6. 用户确认每个命令

使用 -p 选项可以在执行每条命令之前提示用户确认:

cat filelist.txt | xargs -p rm

在每次删除文件之前,xargs 会提示你确认是否执行该命令。

7. 使用定制分隔符

默认情况下,xargs 使用空白字符(空格、制表符、换行符)作为输入分隔符。如果数据使用其他字符分隔,可以使用 -d 选项指定分隔符。假设文件内容以逗号分隔:

echo "file1,file2,file3" | xargs -d',' rm

这里的 xargs -d',' 将逗号作为分隔符,将文件名逐个传递给 rm 命令。

8. 限制执行命令的次数

假设有大量参数需要传递给一个命令,你可以使用 -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