在使用 find命令的-exec選項處理匹配到的檔案時, find命令將所有匹配到的檔案一起傳遞給exec執行。但有些系統對能夠傳遞給exec的命令長度有限制,這樣在find命令執行幾分鐘之後,就會出現溢位錯誤。錯誤資訊通常是“引數列太長”或“引數列溢位”。這就是xargs命令的用處所在,特別是與find命令一起使用。
find命令把匹配到的檔案傳遞給xargs命令,而xargs命令每次只獲取一部分檔案而不是全部,不像-exec選項那樣。這樣它可以先處理最先獲取的一部分檔案,然後是下一批,並如此繼續下去。
在有些系統中,使用-exec選項會為處理每一個匹配到的檔案而發起一個相應的程式,並非將匹配到的檔案全部作為引數一次執行;這樣在有些情況下就會出現程式過多,系統效能下降的問題,因而效率不高; 而使用xargs命令則只有一個程式。另外,在使用xargs命令時,究竟是一次獲取所有的引數,還是分批取得引數,以及每一次獲取引數的數目都會根據該命令的選項及系統核心中相應的可調引數來確定。
使用例項:
例項1: 查詢系統中的每一個普通檔案,然後使用xargs命令來測試它們分別屬於哪類檔案
命令:
1 |
find . -type f -print | xargs file |
輸出:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[root@localhost test]# ll 總計 312 -rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log -rw-r--r-- 1 root root 0 11-12 22:25 log2013.log -rw-r--r-- 1 root root 0 11-12 22:25 log2014.log drwxr-xr-x 6 root root 4096 10-27 01:58 scf drwxrwxrwx 2 root root 4096 11-12 19:32 test3 drwxrwxrwx 2 root root 4096 11-12 19:32 test4 [root@localhost test]# find . -type f -print | xargs file ./log2014.log: empty ./log2013.log: empty ./log2012.log: ASCII text [root@localhost test]# |
例項2:在整個系統中查詢記憶體資訊轉儲檔案(core dump) ,然後把結果儲存到/tmp/core.log 檔案中
命令:
1 |
find / -name "core" -print | xargs echo "" >/tmp/core.log |
輸出:
1 2 3 4 5 6 7 8 |
[root@localhost test]# find / -name "core" -print | xargs echo "" >/tmp/core.log [root@localhost test]# cd /tmp [root@localhost tmp]# ll 總計 16 -rw-r--r-- 1 root root 1524 11-12 22:29 core.log drwx------ 2 root root 4096 11-12 22:24 ssh-TzcZDx1766 drwx------ 2 root root 4096 11-12 22:28 ssh-ykiRPk1815 drwx------ 2 root root 4096 11-03 07:11 vmware-root |
例項3:在當前目錄下查詢所有使用者具有讀、寫和執行許可權的檔案,並收回相應的寫許可權
命令:
1 |
find . -perm -7 -print | xargs chmod o-w |
輸出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
[root@localhost test]# ll 總計 312 -rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log -rw-r--r-- 1 root root 0 11-12 22:25 log2013.log -rw-r--r-- 1 root root 0 11-12 22:25 log2014.log drwxr-xr-x 6 root root 4096 10-27 01:58 scf drwxrwxrwx 2 root root 4096 11-12 19:32 test3 drwxrwxrwx 2 root root 4096 11-12 19:32 test4 [root@localhost test]# find . -perm -7 -print | xargs chmod o-w [root@localhost test]# ll 總計 312 -rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log -rw-r--r-- 1 root root 0 11-12 22:25 log2013.log -rw-r--r-- 1 root root 0 11-12 22:25 log2014.log drwxr-xr-x 6 root root 4096 10-27 01:58 scf drwxrwxr-x 2 root root 4096 11-12 19:32 test3 drwxrwxr-x 2 root root 4096 11-12 19:32 test4 [root@localhost test]# |
說明:
執行命令後,資料夾scf、test3和test4的許可權都發生改變
例項4:用grep命令在所有的普通檔案中搜尋hostname這個詞
命令:
1 |
find . -type f -print | xargs grep "hostname" |
輸出:
1 2 3 4 |
[root@localhost test]# find . -type f -print | xargs grep "hostname" ./log2013.log:hostnamebaidu=baidu.com ./log2013.log:hostnamesina=sina.com ./log2013.log:hostnames=true[root@localhost test]# |
例項5:用grep命令在當前目錄下的所有普通檔案中搜尋hostnames這個詞
命令:
1 |
find . -name * -type f -print | xargs grep "hostnames" |
輸出:
1 2 3 |
[root@peida test]# find . -name \* -type f -print | xargs grep "hostnames" ./log2013.log:hostnamesina=sina.com ./log2013.log:hostnames=true[root@localhost test]# |
說明:
注意,在上面的例子中, 用來取消find命令中的*在shell中的特殊含義。
例項6:使用xargs執行mv
命令:
1 |
find . -name "*.log" | xargs -i mv {} test4 |
輸出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
[root@localhost test]# ll 總計 316 -rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log -rw-r--r-- 1 root root 61 11-12 22:44 log2013.log -rw-r--r-- 1 root root 0 11-12 22:25 log2014.log drwxr-xr-x 6 root root 4096 10-27 01:58 scf drwxrwxr-x 2 root root 4096 11-12 22:54 test3 drwxrwxr-x 2 root root 4096 11-12 19:32 test4 [root@localhost test]# cd test4/ [root@localhost test4]# ll 總計 0[root@localhost test4]# cd .. [root@localhost test]# find . -name "*.log" | xargs -i mv {} test4 [root@localhost test]# ll 總計 12drwxr-xr-x 6 root root 4096 10-27 01:58 scf drwxrwxr-x 2 root root 4096 11-13 05:50 test3 drwxrwxr-x 2 root root 4096 11-13 05:50 test4 [root@localhost test]# cd test4/ [root@localhost test4]# ll 總計 304 -rw-r--r-- 1 root root 302108 11-12 22:54 log2012.log -rw-r--r-- 1 root root 61 11-12 22:54 log2013.log -rw-r--r-- 1 root root 0 11-12 22:54 log2014.log [root@localhost test4]# |
例項7:find後執行xargs提示xargs: argument line too long解決方法:
命令:
1 |
find . -type f -atime +0 -print0 | xargs -0 -l1 -t rm -f |
輸出:
1 2 3 |
[root@pd test4]# find . -type f -atime +0 -print0 | xargs -0 -l1 -t rm -f rm -f [root@pdtest4]# |
說明:
-l1是一次處理一個;-t是處理之前列印出命令
例項8:使用-i引數預設的前面輸出用{}代替,-I引數可以指定其他代替字元,如例子中的[]
命令:
輸出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
[root@localhost test]# ll 總計 12drwxr-xr-x 6 root root 4096 10-27 01:58 scf drwxrwxr-x 2 root root 4096 11-13 05:50 test3 drwxrwxr-x 2 root root 4096 11-13 05:50 test4 [root@localhost test]# cd test4 [root@localhost test4]# find . -name "file" | xargs -I [] cp [] .. [root@localhost test4]# ll 總計 304 -rw-r--r-- 1 root root 302108 11-12 22:54 log2012.log -rw-r--r-- 1 root root 61 11-12 22:54 log2013.log -rw-r--r-- 1 root root 0 11-12 22:54 log2014.log [root@localhost test4]# cd .. [root@localhost test]# ll 總計 316 -rw-r--r-- 1 root root 302108 11-13 06:03 log2012.log -rw-r--r-- 1 root root 61 11-13 06:03 log2013.log -rw-r--r-- 1 root root 0 11-13 06:03 log2014.log drwxr-xr-x 6 root root 4096 10-27 01:58 scf drwxrwxr-x 2 root root 4096 11-13 05:50 test3 drwxrwxr-x 2 root root 4096 11-13 05:50 test4 [root@localhost test]# |
說明:
使用-i引數預設的前面輸出用{}代替,-I引數可以指定其他代替字元,如例子中的[]
例項9:xargs的-p引數的使用
命令:
1 |
find . -name "*.log" | xargs -p -i mv {} .. |
輸出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
[root@localhost test3]# ll 總計 0 -rw-r--r-- 1 root root 0 11-13 06:06 log2015.log [root@localhost test3]# cd .. [root@localhost test]# ll 總計 316 -rw-r--r-- 1 root root 302108 11-13 06:03 log2012.log -rw-r--r-- 1 root root 61 11-13 06:03 log2013.log -rw-r--r-- 1 root root 0 11-13 06:03 log2014.log drwxr-xr-x 6 root root 4096 10-27 01:58 scf drwxrwxr-x 2 root root 4096 11-13 06:06 test3 drwxrwxr-x 2 root root 4096 11-13 05:50 test4 [root@localhost test]# cd test3 [root@localhost test3]# find . -name "*.log" | xargs -p -i mv {} .. mv ./log2015.log .. ?...y [root@localhost test3]# ll 總計 0[root@localhost test3]# cd .. [root@localhost test]# ll 總計 316 -rw-r--r-- 1 root root 302108 11-13 06:03 log2012.log -rw-r--r-- 1 root root 61 11-13 06:03 log2013.log -rw-r--r-- 1 root root 0 11-13 06:03 log2014.log -rw-r--r-- 1 root root 0 11-13 06:06 log2015.log drwxr-xr-x 6 root root 4096 10-27 01:58 scf drwxrwxr-x 2 root root 4096 11-13 06:08 test3 drwxrwxr-x 2 root root 4096 11-13 05:50 test4 [root@localhost test]# |
說明:
-p引數會提示讓你確認是否執行後面的命令,y執行,n不執行。
本系列文章:
每天一個 Linux 命令(1):ls命令
每天一個 Linux 命令(2):cd命令
每天一個 Linux 命令(3):pwd命令
每天一個 Linux 命令(4):mkdir命令
每天一個 Linux 命令(5):rm 命令
每天一個 Linux 命令(6):rmdir 命令
每天一個 Linux 命令(7):mv命令
每天一個 Linux 命令(8):cp 命令
每天一個 Linux 命令(9):touch 命令
每天一個 Linux 命令(10):cat 命令
每天一個 Linux 命令(11):nl 命令
每天一個 Linux 命令(12):more 命令
每天一個 Linux 命令(13):less 命令
每天一個 Linux 命令(14):head 命令
每天一個 Linux 命令(15):tail 命令
每天一個 Linux 命令(16):which命令
每天一個 Linux 命令(17):whereis 命令
每天一個 Linux 命令(18):locate 命令
每天一個 Linux 命令(19):find 命令概覽
每天一個 Linux 命令(20):find命令之exec