在使用 find命令的-exec選項處理匹配到的文件時, find命令將所有匹配到的文件一起傳遞給exec執行。但有些系統對能夠傳遞給exec的命令長度有限制,這樣在find命令運行幾分鐘之後,就會出現溢出錯誤。錯誤信息通常是“參數列太長”或“參數列溢出”。這就是xargs命令的用處所在,特別是與find命令一起使用。
find命令把匹配到的文件傳遞給xargs命令,而xargs命令每次只獲取一部分文件而不是全部,不像-exec選項那樣。這樣它可以先處理最先獲取的一部分文件,然後是下一批,並如此繼續下去。
在有些系統中,使用-exec選項會爲處理每一個匹配到的文件而發起一個相應的進程,並非將匹配到的文件全部作爲參數一次執行;這樣在有些情況下就會出現進程過多,系統性能下降的問題,因而效率不高; 而使用xargs命令則只有一個進程。另外,在使用xargs命令時,究竟是一次獲取所有的參數,還是分批取得參數,以及每一次獲取參數的數目都會根據該命令的選項及系統內核中相應的可調參數來確定。
1. 從當前目錄下開始查找的所有文件,然後使用xargs命令來測試它們分別屬於哪類文件
命令:
find . -type f -print |xargs file
輸出:
[root@localhost test]# ls dir1 log1 log2 [root@localhost test]# find . -type f -print |xargs file ./log1: empty ./log2: ASCII text
2. 從根目錄/開始查找名爲core的文件或目錄,並將查找結果保存到/tmp/core.log 文件中
命令:
find / -name "core" -print | xargs > /tmp/core.log
輸出:
[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字節); >> 這個是將輸出內容追加到目標文件中。如果文件不存在,就創建文件;如果文件存在,則將新的內容追加到那個文件的末尾,該文件中的原有內容不受影響。
3:從當前目錄下開始查找其他用戶具有讀、寫和執行權限的文件,並收回相應的寫權限
命令:
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文件,所屬用戶 所屬組 其他用戶均有讀、寫、執行權限,執行命令後,其他用戶沒有了寫權限,其他權限都還在
4. 用grep命令在從當前目錄下開始查找類型爲文件,且文件內容中含有hostname的文件
命令:
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指令會把含有範本樣式的那一行顯示出來
5. 從當前目錄下開始查找名稱中以log開頭的文件或目錄,並將其移動到dir1目錄中
命令:
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 log2
說明: {} 花括號代表前面find查找出來的文件名。
6. 從當前目錄下開始查找名稱中以log開頭的文件或目錄,並將其移動到當前目錄的父級目錄中,移動時,進行詢問
命令:
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不執行。
7.find後執行xargs提示xargs: argument line too long解決方法:
命令:
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則不會。