其他分享
首页 > 其他分享> > exec和xargs命令的区别

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