使用exec可能存在的问题:
- 在使用find命令匹配的文件运行exec命令时,find命令会把匹配到的文件全部传递给exec命令,但有些系统对能够传送的exec命令有长度限制;
- 在有些系统中,会为每个匹配的find文件执行exec命令启动一个进程,这些在匹配文件较多时,会造成巨大的资源浪费;
而xargs则可以解决这两个问题:
- xargs会分页传送匹配的文件给命令;
- xargs只会启动一个进程运行命令;
参数
使用-i参数表示:find命令的输出用{}代替
-lN是一次处理N个参数
-t是处理之前打印出命令
示例:
- 移动文件
-i
[root@test findTest]# ls
2rd f1 F1 f1.bak F1.bak f2 F2 f2.bak F2.bak f3 F3 f3.bak F3.bak f4 f4.bak test.sh
[root@test findTest]# find . -type f -name "*.bak" | xargs -i mv {} 2rd/
[root@test findTest]# ls 2rd
3rd f1 F1 f1.bak F1.bak f2 F2 f2.bak F2.bak f3 F3 f3.bak F3.bak f4 f4.bak
[root@test findTest]#
- 移动文件
-l -t
[root@test test]# find . -type f -name "*.bak"|xargs -t -l2 -i mv {} findTest/
mv ./f3.bak findTest/
mv ./F3.bak findTest/
mv ./F1.bak findTest/
mv ./f2.bak findTest/
mv ./f4.bak findTest/
mv ./F2.bak findTest/
mv ./f1.bak findTest/
- 搜索包含特定字符的文件
[root@test test]# find . -type f| xargs grep "Everything"
./lessTest/Kconfig: Everything in tmpfs is temporary in the sense that no files will be
./moreTest/Kconfig: Everything in tmpfs is temporary in the sense that no files will be
- 确认是否继续执行
-p
[root@test test]# ls
catTest f1.bak f.bak findTest headTest lessTest moreTest nlTest
[root@test test]# find . -type f -name "*.bak"| xargs -p rm -f
rm -f ./f.bak ./f1.bak ?...y
[root@test test]# ls
catTest findTest headTest lessTest moreTest nlTest
网友评论