介紹
xargs
指令用來讀取標準輸入的每行字串並轉換為指令。
假設有一個檔案file_list
,裡面每一行都代表著不同檔案的路徑:
⤍ cat file_list
/home/mt/Documents/letters
/home/mt/Documents/password
/home/mt/Downloads/game
/var/www/html/homepage
/usr/local/lib/important
...
如果你想要對這些檔案執行某個指令,xargs
就會非常好用:
⤍ cat file_list | xargs ls -l
這邊透過管線的方式把cat file_list
的輸出傳給xargs
,xargs
再利用換行(或空格)把資料一次一個或多個送給ls -l
執行。
也就是說,與下面指令的輸出是一樣的:
⤍ ls -l /home/mt/Documents/letters /home/mt/Documents/password /home/mt/Downloads/game ...
語法
xargs [options] [command]
常用的options
-n k Feed k lines of input to each executed command. The common -n1 guarantees that each execution will process only one line of input. Otherwise, xargs may pass multiple lines of input to a single command.
-0 Set the end-of-line character for input to be ASCII zero rather than whitespace, and treat all characters literally. Use this when the input is coming from find -print0.
xargs
vs 命令替換
看完上面介紹後,是不是覺得跟命令替換很像呢?那到底差在哪裡呢?
⤍ cat file_list | xargs ls -l // xargs
⤍ ls -l $(cat file_list) // 命令替換
⤍ ls -l `cat file_list` // 命令替換
當你把上面三個指令拿去執行,你會發現它們做的事情是一樣的。不過其實使用命令替換是有可能會發生錯誤的,因為它可能會讓指令變得超級長,最後超出最大長度限制。xargs
則是一次送一個或多個資料來執行,並非一次全部送出執行。
所以對於長指令來說,使用xargs
會比命令替換更安全及穩定。
範例
你可以將要刪除的檔案路徑寫入一個檔案裡,再一併刪除:
⤍ cat file_list | xargs rm -f
你可以尋找哪些檔案包含特定字串:
⤍ find . -type f -print | xargs grep -l computer // 尋找包含computer字串的檔案
利用find
指令與xargs
來快速尋找檔案,非常好用。
如果檔名包含空格,xargs
會以為是不同檔案,最後對錯誤的檔案執行指令,這是非常危險的,不過可以透過find -print0
及xargs -0
來跳過這些空格:
⤍ find . -type f -print0 | xargs -0 grep -l computer
這樣就不會發生檔名包含空格的問題了。
發佈留言