1. 程式人生 > 其它 >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