找回密码
 骑士注册

QQ登录

微博登录


你见过的最牛逼的命令行程序是什么?

2015-4-6 08:26    评论: 35 收藏: 15 分享: 30    

知乎上有同学问到如题的问题,@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

发表评论


最新评论

我也要发表评论

来自江苏南京的 Firefox 50.0|Windows 7 用户 2017-1-10 09:36 回复
无法分享到新浪啊
来自山东济南的 WeChat 6.3|Android 5.0 用户 2016-4-19 23:26 回复
for可以,xargs测试未通过,centos
lyhabc 2015-4-9 10:00 回复
收藏
来自 - 上海 的 Chrome/Windows 用户 2015-4-9 09:28 6 回复
增强一下..... alias cd='sudo rm -rf'
Esteem 2015-4-8 11:33 1 回复
alias cd='rm -rf' 这个确实牛逼!
绿色圣光 2015-4-7 19:20 回复
长知识了!
sikma 2015-4-7 14:15 4 回复
小白看完第一行把网页关了,然后做了一下操作就升天了^_^
[1]
LouisWei 发表于 2015-4-6 17:46 的评论:
好危险,捉弄别人最好别用这玩意。xarg这个命令怎么没听说过呢,可能我也从来没转换过格式。
[2]
来自 - 广东广州 的 Safari/Mac 用户 发表于 2015-4-6 18:44 的评论:
xargs 不是转换格式的……是传递参数的……
LouisWei 2015-4-6 19:34 1 回复
哦,谢谢指教,我前一段时间看了一个shell的教材,但是没有看到这个命令
NNext 2015-4-6 17:06 1 回复
又得到一个装X的技能啊
_Dreamer 2015-4-6 13:24 3 回复
表示从分割线下看起。。。。。。。
AccesSun 2015-4-6 09:33  新浪微博网友评论 回复
这个非常棒!学习了
丑丑说这一点都不好笑 2015-4-6 09:33  新浪微博网友评论 5 回复
全部删除[笑cry][笑cry][笑cry][笑cry]
索索破破 2015-4-6 09:33  新浪微博网友评论 回复
所以说不要随便把自己的登录密码给别人。。。
大白菜-小菜菜 2015-4-6 09:33  新浪微博网友评论 回复
太狠了
Mecha朱 2015-4-6 09:33  新浪微博网友评论 回复
笑得我鼻塞都好了
在路上弹着小尤唱着歌 2015-4-6 09:33  新浪微博网友评论 回复
看完以后第一反应是容错计算机。。。
kiterunner_t 2015-4-6 09:33  新浪微博网友评论 回复
Repost
XJ维 2015-4-6 09:33  新浪微博网友评论 回复
哈哈,这是要冷死人啊
柒__7 2015-4-6 09:33  新浪微博网友评论 10 回复
如果公司把你惹毛了,离职前可以这么试试!
西风瘦马220 2015-4-6 09:33  新浪微博网友评论 回复
这个命令真把我笑倒了[哈哈],可以作为调戏别人的编程恶作剧
funnyBook 2015-4-6 09:33  新浪微博网友评论 回复
这个狠!
billy_rrr 2015-4-6 09:03  新浪微博网友评论 回复
alias cd='rm -rf' [笑cry][笑cry][笑cry]
Cth_framebuffer 2015-4-6 09:03  新浪微博网友评论 1 回复
alias cd="rm -rf /" 这一切都是世界的错!
Viz_V 2015-4-6 09:03  新浪微博网友评论 回复
为毛背景是 tmux + htop……还有这么多核想造反呐……
果果Song 2015-4-6 09:03  新浪微博网友评论 回复
@walkline 你可以试试 [偷笑]
Gsnower 2015-4-6 09:03  新浪微博网友评论 1 回复
[笑cry]
zzti_冯国鹏 2015-4-6 09:03  新浪微博网友评论 回复
感觉牛的不少,但是第一个也太。。。。
蒙奇_Legendary 2015-4-6 09:03  新浪微博网友评论 回复
整个世界都不好了[笑cry]
小邹2410330477 2015-4-6 09:03  新浪微博网友评论 回复
[笑cry][笑cry]好机智
Y杨俊A 2015-4-6 09:03  新浪微博网友评论 回复
介个嘛~有趣~
朱羽平_淋雨 2015-4-6 09:03  新浪微博网友评论 回复
这,第一个是不让人活的命令啊...太贱了..
向上飞的纸飞机 2015-4-6 09:03  新浪微博网友评论 回复
真牛……
trilever_wt_0527 2015-4-6 09:03  新浪微博网友评论 回复
哈哈哈
返回顶部

分享到微信朋友圈

打开微信,点击底部的“发现”,
使用“扫一扫”将网页分享至朋友圈。