你見過的最牛逼的命令行程序是什么?

jopen 9年前發布 | 6K 次閱讀 程序

知乎上有同學問到如題的問題,@grapeot 同學的一個回答得到了眾多點贊,特此分享給大家:

alias cd='rm -rf'

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

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

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

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

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

ls *.jpg | xargs -I{} convert "{}" `echo {} | sed 's/jpg$/png/'` 

好像沒什么區別?

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

ls *.jpg | xargs -I{} -P 8 convert "{}" `echo {} | sed 's/jpg$/png/'` 

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

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

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

壞消息是不行,好消息是,穿個馬甲就好啦。把xargs改成parallel (GNU Parallel - GNU Project)即可。

ls *.jpg | parallel -I{} -S 32/m{1..4} convert "{}" `echo {} | sed 's/jpg$/png/'` 

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

效果?

你見過的最牛逼的命令行程序是什么?

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

猛擊【Easy and cheap cluster building on AWS】有驚喜

主頁君注:好吧,顯然主頁君認為上面是條廣告,要點點看嘛?.........(幾分鐘后回來)“你值得擁有!” ;D

原文:http://www.zhihu.com/question/29257300/answer/43814464
作者: @grapeot

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!