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
...

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

⤍ cat file_list | xargs ls -l

這邊透過管線的方式把cat file_list的輸出傳給xargsxargs再利用換行(或空格)把資料一次一個或多個送給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 -print0xargs -0來跳過這些空格:

⤍ find . -type f -print0 | xargs -0 grep -l computer

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

發佈留言