exec和xargs命令的區別
阿新 • • 發佈:2022-04-18
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