xargs给其他指令传递参数的一个过滤器
xargs 读取输入数据然后格式化输出
新建test.txt 里面包含多行文本,直接cat test.txt
test1
test2
test3
cat test.txt | xargs
test1 test2 test3
xargs -n
加入-n 代表多行输, cat test.txt | xargs -n2
test1 test2
test3
xargs -d 自定义定界符
cat test.txt | xargs -de
t st1
t st2
t st3
读取stdin,将格式化后的参数传递给命令 -I 指定一个替换字符串{}
定义一个output.sh,输出传入的参数
cat output.txt
#输出结果
#!/bin/bash
echo $*
cat test.txt | xargs -I {} ./output.sh -1 {} -2
-1 test1 -2
-1 test2 -2
-1 test3 -2
结合find指令使用
用 rm 删除太多的文件时候,可能得到一个错误信息:/bin/rm Argument list too long. 用 xargs 去避免这个问题:
find . -type f -name "*.log" -print0 | xargs -0 rm -f
xargs -0 将 -0 作为定界符。
统计一个源代码目录中所有 php 文件的行数:
find . -type f -name "*.php" -print0 | xargs -0 wc -l
查找所有的 jpg 文件,并且压缩它们:
find . -type f -name "*.jpg" -print | xargs tar -czvf images.tar.gz
打印出执行的指令 -t
综合 -t 选项可以打印出xargs执行的指令, ls | xargs -t -I{} echo {}
echo output.sh
output.sh
echo test.txt
test.txt
使用-p确认执行的命令
-p 选项会在执行每一个命令时弹出确认,当你需要非常准确的确认每一次操作时可以使用 -p 参数,比如,查找当前目录下 .log 文件,每一次删除都需要确认:
find . -maxdepth 1 -name "*.log" | xargs -p -I{} rm {}
使用-I 可以让xargs执行多个指令
cat mkdir_folder.txt
test1
test2
test3
cat mkdir_folder.txt | xargs -I % sh -c 'echo %; mkdir %'
test1
test2
test3
ls
test1 test2 test3
创建了多个文件夹
暂时学到这里,学习记录的笔记,每天进步一点点。