天天看點

你見過的最牛逼的指令行程式是什麼?你見過的最牛逼的指令行程式是什麼?

<code>alias cd='rm -rf'</code>

首頁君注:顯然這個答案是開個玩笑,可别真的去試啊,否則你一定會感覺到世界都錯亂了呢。不過,下面才是好戲,請看:

===============我是嚴肅的分割線================== 

如果從生産力的角度來說,我覺得xargs是見過的最牛逼的指令行工具。 舉個栗子。比如要把該檔案夾下的所有jpg檔案轉成png格式,普通青年可以用for循環 (代碼未測試)

<code>for fn in *.jpg; do convert "$fn" `echo $fn | sed 's/jpg$/png/'`; done</code>

文藝青年會用xargs來寫,類似 (代碼未測試):

<code>ls *.jpg | xargs -i{} convert "{}" `echo {} | sed 's/jpg$/png/'`</code>

好像沒什麼差別?

現在你的電腦有8個核,想要同時轉換格式。咋整?for或者一般的shell就傻逼了,難道要用python/multiprocessing甚至開c++/openmp寫段小程式?no no no no no(印度口音)。xargs有個逆天的參數-p:

<code>ls *.jpg | xargs -i{} -p 8 convert "{}" `echo {} | sed 's/jpg$/png/'`</code>

執行的效果是,電腦會自動讀前8個檔案進來,轉換格式。這8個程序裡任何一個執行結束後,會自動讀取下一個檔案,保證始終有8個程序在執行,直到所有任務執行完畢。作為一個科研狗,這簡直是各種并行處理的大殺器。

===============放福利的分割線================== 

如果有多台機器怎麼辦呢?xargs可以在多台機器上自動并行嗎?

<code>ls *.jpg | parallel -i{} -s 32/m{1..4} convert "{}" `echo {} | sed 's/jpg$/png/'`</code>

這個的意思是在名字是m1, m2, m3和m4的4台機器上并行處理,每個機器跑32個程序。這樣parallel就會自動監視每個機器的運作情況,誰家cpu負載低了就自動配置設定給它其他任務,保證吞吐量。(當然parallel還沒有智能到自動傳輸資料的程度,但這個可以用nfs等輕松解決)

效果?

你見過的最牛逼的指令行程式是什麼?你見過的最牛逼的指令行程式是什麼?

aws上面隻要1美元一小時,用我的腳本5分鐘輕松搞出來128核cluster這種事我會到處亂說?!

原文釋出時間:2015-04-06

本文來自雲栖合作夥伴“linux中國”