在使用 find命令的-exec選項處理匹配到的文件時, find命令將全部匹配到的文件一塊兒傳遞給exec執行。但有些系統對可以傳遞給exec的命令長度有限制,這樣在find命令運行幾分鐘以後,就會出現溢出錯誤。錯誤信息一般是「參數列太長」或「參數列溢出」。這就是xargs命令的用處所在,特別是與find命令一塊兒使用。性能
find命令把匹配到的文件傳遞給xargs命令,而xargs命令每次只獲取一部分文件而不是所有,不像-exec選項那樣。這樣它能夠先處理最早獲取的一部分文件,而後是下一批,並如此繼續下去。測試
在有些系統中,使用-exec選項會爲處理每個匹配到的文件而發起一個相應的進程,並不是將匹配到的文件所有做爲參數一次執行;這樣在有些狀況下就會出現進程過多,系統性能降低的問題,於是效率不高; 而使用xargs命令則只有一個進程。另外,在使用xargs命令時,到底是一次獲取全部的參數,仍是分批取得參數,以及每一次獲取參數的數目都會根據該命令的選項及系統內核中相應的可調參數來肯定。spa
命令:日誌
find . -type f -print |xargs file
輸出:code
root@localhost test]# ls dir1 log1 log2 [root@localhost test]# find . -type f -print |xargs file ./log1: empty ./log2: ASCII text
命令:xml
find / -name "core" -print | xargs > /tmp/core.log
輸出:blog
[root@localhost tmp]# ls xmlXPathIniteihlTv.c xmlXPathInitLrmz_p.c xmlXPathInitpywFgf.c xmlXPathInitv76QxM.c yum_save_tx.2018-11-15.18-23.5nqJ3w.yumtx yum_save_tx.2018-11-16.23-54.cMoa46.yumtx [root@localhost tmp]# find / -name 'core' -print |xargs > /tmp/core.log [root@localhost tmp]# ls core.log xmlXPathIniteihlTv.c xmlXPathInitLrmz_p.c xmlXPathInitpywFgf.c xmlXPathInitv76QxM.c yum_save_tx.2018-11-15.18-23.5nqJ3w.yumtx yum_save_tx.2018-11-16.23-54.cMoa46.yumtx [root@localhost tmp]# cat core.log /dev/core /proc/sys/net/core /usr/lib/python2.7/site-packages/firewall/core /usr/lib/modules/3.10.0-693.el7.x86_64/kernel/drivers/infiniband/core
/usr/lib/modules/3.10.0-693.el7.x86_64/kernel/drivers/memstick/core /usr/lib/modules/3.10.0-693.el7.x86_64/kernel/drivers/mmc/core
/usr/lib/modules/3.10.0-693.el7.x86_64/kernel/drivers/net/ethernet/mellanox/mlx5/core /usr/lib/modules/3.10.0-693.el7.x86_64/kernel/drivers/usb/core
/usr/lib/modules/3.10.0-693.el7.x86_64/kernel/net/core /usr/lib/modules/3.10.0-693.el7.x86_64/kernel/sound/core /usr/lib/modules/3.10.0-862.14.4.el7.x86_64/kernel/drivers/infiniband/core
/usr/lib/modules/3.10.0-862.14.4.el7.x86_64/kernel/drivers/memstick/core /usr/lib/modules/3.10.0-862.14.4.el7.x86_64/kernel/drivers/mmc/core
/usr/lib/modules/3.10.0-862.14.4.el7.x86_64/kernel/drivers/net/ethernet/mellanox/mlx5/core /usr/lib/modules/3.10.0-862.14.4.el7.x86_64/kernel/drivers/usb/core
/usr/lib/modules/3.10.0-862.14.4.el7.x86_64/kernel/net/core /usr/lib/modules/3.10.0-862.14.4.el7.x86_64/kernel/sound/core
說明:進程
> 是定向輸出到文件,若是文件不存在,就建立文件;若是文件存在,就將其清空;通常咱們備份清理日誌文件的時候,就是這種方法:先備份日誌,再用>,將日誌文件清空(文件大小變成0字節); >> 這個是將輸出內容追加到目標文件中。若是文件不存在,就建立文件;若是文件存在,則將新的內容追加到那個文件的末尾,該文件中的原有內容不受影響。
命令:字符串
find . -perm -7 -print | xargs chmod o-w
輸出:
[root@localhost test]# ll total 4 drwxr-xr-x. 2 root root 6 Nov 20 18:28 dir1 -rwxrwxrwx. 1 root root 0 Nov 20 18:28 log1 -rw-r--r--. 1 root root 4 Nov 20 18:29 log2 [root@localhost test]# find . -perm -7 -print | xargs chmod o-w [root@localhost test]# ll total 4 drwxr-xr-x. 2 root root 6 Nov 20 18:28 dir1 -rwxrwxr-x. 1 root root 0 Nov 20 18:28 log1 -rw-r--r--. 1 root root 4 Nov 20 18:29 log2
說明:
能夠看到,執行命令前 log1文件,所屬用戶 所屬組 其餘用戶均有讀、寫、執行權限,執行命令後,其餘用戶沒有了寫權限,其餘權限都還在
命令:
find . -type f -print | xargs grep "hostname"
輸出:
[root@localhost test]# ls dir1 log1 log2 [root@localhost test]# cat log1 [root@localhost test]# cat log2 我是log2 hostnamesina=sina.com 哈哈 第三行 [root@localhost test]# find . -type f -print | xargs grep "hostname" ./log2:hostnamesina=sina.com 哈哈
說明:
Linux grep命令用於查找文件裏符合條件的字符串。
grep指令用於查找內容包含指定的範本樣式的文件,若是發現某文件的內容符合所指定的範本樣式,預設grep指令會把含有範本樣式的那一行顯示出來
命令:
find . -name 'log*' | xargs -i mv {} dir1
輸出:
[root@localhost test]# ls dir1 log1 log2 [root@localhost test]# find . -name 'log*' | xargs -i mv {} dir1 [root@localhost test]# ls dir1 [root@localhost test]# cd dir1/ [root@localhost dir1]# ls log1 log
說明:
{} 花括號表明前面find查找出來的文件名。
命令:
find . -name "log*" | xargs -p -i mv {} ..
輸出:
[root@localhost test]# ls dir1 [root@localhost test]# cd dir1/ [root@localhost dir1]# ls log1 log2 log3 [root@localhost dir1]# find . -name "log*" | xargs -p -i mv {} .. mv ./log1 .. ?...y mv ./log2 .. ?...y mv ./log3 .. ?...n [root@localhost dir1]# ls log3 [root@localhost dir1]# cd .. [root@localhost test]# ls dir1 log1 log2
說明:
-p參數會提示讓你確認是否執行後面的命令,y執行,n不執行。
命令:
find . -type f -atime +0 -print0 | xargs -0 -l1 -t rm -f
輸出:
[root@localhost dir1]# find . -type f -atime +0 -print0 | xargs -0 -l1 -t rm -f rm -f [root@localhost dir1]#
說明:
-l1 是指一次處理一個 -t 是指處理以前打印出的命令 -print 在每個輸出後會添加一個回車換行符,而-print0則不會。