你見過的最牛逼的命令行程序是什么?
知乎上有同學問到如題的問題,@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