xargs是给命令 传递参数 的一个过滤器,也是组合多个命令的一个工具。它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理。通过管道传递给xargs的输入 可以 包含换行和空白,不过 xargs 将把 换行和空白 用 空格 取代。
xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令,下面是一些如何有效使用xargs 的实用例子。
1. 当你尝试用rm 删除太多的文件,你可能得到一个错误信息:/bin/rm Argument list too long. 用xargs 去避免这个问题
find ~ -name ‘*.log’ -print0 | xargs -0 rm -f
2. 获得/etc/ 下所有*.conf 结尾的文件列表,有几种不同的方法能得到相同的结果,下面的例子仅仅是示范怎么实用xargs ,在这个例子中实用 xargs将find 命令的输出传递给ls -l
# find /etc -name "*.conf" | xargs ls –l
3. 假如你有一个文件包含了很多你希望下载的URL, 你能够使用xargs 下载所有链接
# cat url-list.txt | xargs wget –c
4. 查找所有的jpg 文件,并且压缩它
# find / -name *.jpg -type f -print | xargs tar -cvzf images.tar.gz
5. 拷贝所有的图片文件到一个外部的硬盘驱动
# ls *.jpg | xargs -n1 -i cp {} /external-hard-drive/directory
++++++++++++++++++++++++++++++++++++++++
递归查找所有Python文件并统计文件行数
find . -name '*.py' | xargs wc -l
递归查找所有Emacs备份文件并删除:
find . -name '*~' | xargs rm
递归查找所有Python文件并搜索import语句:
find . -name '*.py' | xargs grep 'import'
处理文件/目录名中的空格
上面的例子有一个问题,如果文件或是目录名含有空格,则可能会有些问题,这是因为 xargs默认 会按照空白字符(包括 换号 和 table)来 划分输入。一个简单的解决办法就是告诉find使用NUL(\0)来分割结果(通过向find提供-print0选项),并且告诉xargs也使用Nul来分隔输入(-0)。
删除备份文件,即使含有空格:
find . -name '*~' -print0 | xargs -0 rm