exec和xargs命令的区别
作者:互联网
xargs
xargs命令需要结合管道符|使用,其格式为:**** | xargs command
# find ./ -type f | xargs echo
./main.cpp ./a.out ./test_backtrace.exe
xargs是把所有找到的文件名一股脑的转给命令。
当文件很多时,这些文件名组合成的命令行参数很容易超长,导致命令出错。
当参数中存在空格时就会出错,因为此时不知道空格是一个参数中的一部分。
遇到这些情况时,使用-i参数使得每个每个文件名处理一次,{}表示文件名的占位符。
# find ./ -type f | xargs -i echo {}
./main.cpp
./a.out
./test_backtrace.exe
一些常见用法
格式化数据
# echo "a b c d e f g" | xargs -d' ' -n2
a b
c d
e f
g
-d' ':用空格作为分隔符
-n2:一行输出多少个参数
读取文件内容,用文件中的内容批量创建文件。
# cat foo.txt
a
b
c
# cat foo.txt | xargs -I name sh -c 'echo name;mkdir name;'
a
b
c
# ls -l
总用量 48
drwxr-xr-x 2 root root 6 4月 15 17:54 a
drwxr-xr-x 2 root root 6 4月 15 17:54 b
drwxr-xr-x 2 root root 6 4月 15 17:54 c
-rw-r--r-- 1 root root 6 4月 15 17:48 foo.txt
-I name:将参数取个别名,方便后面使用
文件批量复制
# touch {1..5}.txt
# ls *.txt | xargs -I name cp name name.new
# ls -l
总用量 48
-rw-r--r-- 1 root root 0 4月 15 18:06 1.txt
-rw-r--r-- 1 root root 0 4月 15 18:06 1.txt.new
-rw-r--r-- 1 root root 0 4月 15 18:06 2.txt
-rw-r--r-- 1 root root 0 4月 15 18:06 2.txt.new
-rw-r--r-- 1 root root 0 4月 15 18:06 3.txt
-rw-r--r-- 1 root root 0 4月 15 18:06 3.txt.new
-rw-r--r-- 1 root root 0 4月 15 18:06 4.txt
-rw-r--r-- 1 root root 0 4月 15 18:06 4.txt.new
-rw-r--r-- 1 root root 0 4月 15 18:06 5.txt
-rw-r--r-- 1 root root 0 4月 15 18:06 5.txt.new
exec
格式:-exec 命令 {} ; -exec 命令 {} +
{}表示参数的占位符
“;”:表示每个参数处理一次。因为分号在命令中还有它用途,所以就用一个\来转义
“+”:表示拼接参数后,一次性处理。
#find ./ -type f -exec echo {} \;
./main.cpp
./a.out
./test_backtrace.exe
#find ./ -type f -exec echo {} +
./main.cpp ./a.out ./test_backtrace.exe
可以后接执行多次exec
#find ./ -type f -exec echo {} + -exec echo {} \;
./main.cpp
./a.out
./test_backtrace.exe
./main.cpp ./a.out ./test_backtrace.exe
ok
ok命令和exec作用相同,唯一的区别在于ok是exec命令的安全模式,在执行command之前会给出提示。
xargs和exec的性能比较
[root@localhost test]# touch {1..10000}.txt
[root@localhost test]# time find ./ -type f -name '*.txt' |xargs rm -f
real 0m0.149s
user 0m0.014s
sys 0m0.136s
[root@localhost test]# touch {1..10000}.txt
[root@localhost test]# time find ./ -type f -name '*.txt' -exec rm {} \;
real 0m6.715s
user 0m3.637s
sys 0m2.665s
结论:在处理大量文件时,xargs优于exec
[root@localhost test]# touch {1..100}.txt
[root@localhost test]# time find ./ -type f -name '*.txt' |xargs rm -f
real 0m0.003s
user 0m0.001s
sys 0m0.004s
[root@localhost test]# touch {1..100}.txt
[root@localhost test]# time find ./ -type f -name '*.txt' -exec rm {} \;
real 0m0.070s
user 0m0.041s
sys 0m0.025s
结论:在处理少量文件时,xargs仍优于exec
原因:xargs是批量执行的,所以效率高。如果改成xargs -i模式,性能和exec一样。
refer
https://blog.csdn.net/Zhenzhong_Xu/article/details/115337720
https://www.cnblogs.com/ophui/p/15438447.html
标签:xargs,15,区别,--,exec,txt,root 来源: https://www.cnblogs.com/txtp/p/16159108.html