2015-03-11

Ubuntu Linux 用 xargs 指令處理大量檔案

阿舍是在解決之前遇到的 cp 指令的問題的時候,發現到這個 xargs 指令的,一開始,阿舍也看不太懂 xargs 是要做什麼的,不過,阿舍研究了一下 Man Page,然後,再多看看幾個範例後,終於,阿舍有懂了這個 xargs 指令的用法,原來,xargs 用來收清單來給其它指令用的時候,就會很好用哩 ! ...




「build and execute command lines from standard input」這個 xargs 的 Man Page 上的說明,阿舍沒有看很瞭解,只知道 xargs 可以透過管道符號(|)來傳資料給 xargs 指令處理,但是,不知道怎麼去使用收到的資料,直到阿舍看到類似下面這樣的例子後才恍然大悟哩 !

$ ls ./bak/*.txt | xargs rm

xargs 會把收到的資料送給 xargs 後的指令來當參數使用,以上面這行指令來說,會把 ls 列出來的檔案清單透過 xargs 指令來傳給 rm 指令當作要被刪除的檔案清單哩 ! 可是,以上面這個指令來說,rm 指令不是自己就可以用下面這行指令來刪除了嗎 ?

$ rm ./bak/*.txt

是啊 ! 阿舍也有相同的疑問哩 ! 為什麼還會需要用到 xargs 指令哩 ? 喔 ! 阿舍運氣還不錯,有遇到要把多個在不同資料夾下的 png 圖檔都搬到另一個相同的資料夾來放,就有機會運用一下 xargs 指令,然後,就懂了哩 ! 像阿舍這種要搬不同資料夾的檔案的需求,一般只用 mv 指令就要打好幾次指令,而如果用 find 指令搭配 xargs 指令的話,就只要像下面這樣,一行就可以搞定囉 !

$ find ~/ -name *.png -type f | xargs -I % mv % ./image

雖然,上面這一行指令看來有點小複雜,但是,其實,就是透過 find 指令去找出 *.png 檔案 ( -type f 選項是限定只傳回檔案而不包資料夾),然後,經由 xargs 指令傳給 mv 指令當來源檔案清單來把檔案搬到 image 資料夾去哩 !

xargs 指令操作範例

其中,xargs 指令後面的 -I 選項是用來告訴 xargs 指令用 % 符號來當作 find 傳進來的檔案清單,所以,後面的 mv 指令就可以用 % 符號當作來源檔案使用哩 ! 不一定要用 % 符號,可以用別的,而如果是像 rm 這種不用有二個參數的指令,就不需要用到 -I 選項哩 ! ...

後來,阿舍發現,其實這個 xargs 指令還滿實用的,只要是需要用到清單的指令,都可以先用其它程式先處理過,然後,再交由 xargs 指令來給其它指令當參數執行,這樣,就可以省很多時間,少打不少字哩 ! ... 供參囉 !

推薦閱讀


有疑問? 問題還是沒解決嗎? 歡迎下方留言提問和討論 😁

沒有留言 :

張貼留言

歡迎留言提問和討論 .... 😁