LINUX

LINUX XARGS指令

介紹

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 ...
Code language: plaintext (plaintext)

如果你想要對這些檔案執行某個指令,xargs就會非常好用:

⤍ cat file_list | xargs ls -l
Code language: plaintext (plaintext)

這邊透過管線的方式把cat file_list的輸出傳給xargsxargs再利用換行(或空格)把資料一次一個或多個送給ls -l執行。

也就是說,與下面指令的輸出是一樣的:

⤍ ls -l /home/mt/Documents/letters /home/mt/Documents/password /home/mt/Downloads/game ...
Code language: plaintext (plaintext)

語法

xargs [options] [command]
Code language: plaintext (plaintext)

常用的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.
Code language: plaintext (plaintext)

xargs vs 命令替換

看完上面介紹後,是不是覺得跟命令替換很像呢?那到底差在哪裡呢?

⤍ cat file_list | xargs ls -l // xargs ⤍ ls -l $(cat file_list) // 命令替換 ⤍ ls -l `cat file_list` // 命令替換
Code language: plaintext (plaintext)

當你把上面三個指令拿去執行,你會發現它們做的事情是一樣的。不過其實使用命令替換是有可能會發生錯誤的,因為它可能會讓指令變得超級長,最後超出最大長度限制。xargs則是一次送一個或多個資料來執行,並非一次全部送出執行。

所以對於長指令來說,使用xargs會比命令替換更安全及穩定。

範例

你可以將要刪除的檔案路徑寫入一個檔案裡,再一併刪除:

⤍ cat file_list | xargs rm -f
Code language: plaintext (plaintext)

你可以尋找哪些檔案包含特定字串:

⤍ find . -type f -print | xargs grep -l computer // 尋找包含computer字串的檔案
Code language: plaintext (plaintext)

利用find指令xargs來快速尋找檔案,非常好用。

如果檔名包含空格,xargs會以為是不同檔案,最後對錯誤的檔案執行指令,這是非常危險的,不過可以透過find -print0xargs -0來跳過這些空格:

⤍ find . -type f -print0 | xargs -0 grep -l computer
Code language: plaintext (plaintext)

這樣就不會發生檔名包含空格的問題了。

發佈留言