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

简介:

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

知乎上有同学问到如题的问题,@grapeot 同学的一个回答得到了众多点赞,特此分享给大家:

 
 
  1. alias cd='rm -rf'

主页君注:显然这个答案是开个玩笑,可别真的去试啊,否则你一定会感觉到世界都错乱了呢。不过,下面才是好戏,请看:

===============我是严肃的分割线================== 

如果从生产力的角度来说,我觉得xargs是见过的最牛逼的命令行工具。 举个栗子。比如要把该文件夹下的所有jpg文件转成png格式,普通青年可以用for循环 (代码未测试)

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

文艺青年会用xargs来写,类似 (代码未测试):

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

好像没什么区别?

现在你的电脑有8个核,想要同时转换格式。咋整?for或者一般的shell就傻逼了,难道要用python/multiprocessing甚至开C++/OpenMP写段小程序?no no no no no(印度口音)。xargs有个逆天的参数-P:

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

执行的效果是,电脑会自动读前8个文件进来,转换格式。这8个进程里任何一个执行结束后,会自动读取下一个文件,保证始终有8个进程在执行,直到所有任务执行完毕。作为一个科研狗,这简直是各种并行处理的大杀器。

===============放福利的分割线================== 

如果有多台机器怎么办呢?xargs可以在多台机器上自动并行吗?

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

 
 
  1. 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这种事我会到处乱说?!

原文发布时间:2015-04-06

本文来自云栖合作伙伴“linux中国”

目录
相关文章
|
3月前
|
运维 开发工具 Windows
PowerShell系列(五):PowerShell通过脚本方式运行笔记
【1月更文挑战第7天】方便迁移,比如在之前工作经验积累下来的运维脚本,可以保存下来。如果业务场景用的到的话,直接文件拷贝过来就可以运行。
|
4月前
|
存储 Shell
Shell【工具 01】Shc一个用于将Shell脚本编译成二进制可执行文件的工具(下载安装使用)
Shell【工具 01】Shc一个用于将Shell脚本编译成二进制可执行文件的工具(下载安装使用)
68 1
|
应用服务中间件 nginx C++
完整的命令行程序
完整的命令行程序
82 0
|
开发者 Python
命令行与脚本|学习笔记
快速学习命令行与脚本
|
Rust JavaScript Java
命令行工具开发:如何快速实现命令行提示?
对于稍微复杂一些的命令行工具,命令行的提示功能必不可少。那么对于不同语言的开发者,有没有一种简单快捷的实现方式呢?本文分享一种快速实现的方法,使用YAML文件定义命令行工具的使用规范,再通过工具自动生成各种shell的命令行提示脚本,最后分享一些至关重要的命令行解析器。
命令行工具开发:如何快速实现命令行提示?
|
Unix Linux 安全
学会在命令行中获取帮助
 学会在命令行中获取帮助 在 Linux 环境中,如果你遇到困难,可以使用man命令,它是Manual pages的缩写。 Manual pages 是 UNIX 或类 UNIX 操作系统中在线软件文档的一种普遍的形式, 内容包括计算机程序(包括库和系统调用)、正式的标准和惯例,甚至是抽象的概念。
Powershell 编写和运行脚本
  Powershell 编写和运行脚本 一个Powershell仅仅是一个包含Powershell代码的文本文件。如果这个文本文件执行,Powershell解释器会逐行解释并执行它的的语句。
1079 0