|
Linux的 rename 命令有两个版本,一个是C语言版本的,一个是Perl语言版本的,早期的Linux发行版基本上使用的是C语言版本的,现在已经很难见到C语言版本的了,因为Perl版本的支持正则处理,所以功能更加强大,已经不再需要C语言版本的了。 如何区分系统里的rename命令是哪个版本的? 输入 man rename 看到第一行是 RENAME(1) Linux Programmer’s Manual RENAME(1) 那么 这个就是C语言版本的。
而如果出现的是: 这个就是Perl版本的了!
C语言的,按照man上面的注解, rename from to file 这个命令有三个参数,分别是 from : 修改什么名字, to:改成什么名字, file 需要修改的文件是哪些。
用法示例:
这句命令的意思很明白了,把 以 log开头的所有文件中的 log字符替换为 history
rename C语言版本的另一个man示例是把后缀名批量修改, rename .jpeg .jpg *.jpeg 这样,所有以 .jpeg扩展的后缀名全部被修改为 .jpg 现在总结一下rename C语言版本所能实现的功能: 批量修改文件名,结果是每个文件会被用相同的一个字符串替换掉!也就是说,无法实现诸如循环 然后按编号重命名! 2, Perl 版本的批量重命名,带有Perl的好处是,你可以使用正则表达式来完成很奇特的功能。 perl 版本的参数格式: rename perlexpr files 注意,perl版本的rename只有两个参数,第一个参数为perl正则表达式,第二个参数为所要处理的文件 man rename的帮助示例: 1) 有一批文件,以 .bak结尾,现在想把这些 .bak 统统去掉。 rename 's/\.bak$//' *.bak 这个命令很简单,因为我还没有系统学习过perl,我不知道perl里替换字符串是不是这么干的,但sed是这么干的,所以如果你有sed或者tr基础,很容易明白,这个替换和sed里的正则语法是一模一样的。 2) 把所有文件名内含有大小字母的,修改为小写字母。 rename 'y/A-Z/a-z/' * 依然和sed的替换语法一样,不用多解释,如果看不懂的话,可以系统学习一下sed先。 还有几个比较实用的例子:
1) 批量去掉文件名里的空格 网上流程的两个去空格的版本: 1) tr 版:
find . -type f -name "* *" -print |
这个版本以前我一直用的,不知道哪个网上搜刮来的,当时还没有系统的学习过 tr/sed/awk命令。 所以这段代码可以简化:
find . -type f -name "* *" | tr 可以看着是 sed 的一个精简版本,tr 用下划线来替换空格。 还有一个 是 sed 版本实现: for f in *;do mv "$f" `echo "$f" | sed 's/[ ]\+/_/g' `; done 这里的 sed表达式还可以这样写: sed 's/[[:space:]]\+/_/g' 不过记住,sed里的出现一次或多次的加号是需要添加反斜杠的。即:\+ 这样就可以了。 好了,这两种办法都太他妈罗嗦了,看看rename实现吧: rename 's/[ ]+/_/g' *
OK就这么简单。
这里注意,rename 采用的是标准perl正则语法,所以无须将 加号转变为反斜杠加号
还有几个好玩的例子:
统一把.html扩展名修改为 .htm
统一在尾部追加 .zip后缀:
统一去掉.zip后缀: Ok ,rename就研究了这么多,暂时不知道如何在rename中引入动态变量,比如 $i++ 我测试过 i=0; rename -n "s/^.*$/$((++i))/" * 执行后i被自增了1,并非想我想像中那样,可以在每操作一个文件自增一,猜想可能是因为rename批量实现的,导致++i只计算一次! -n 用来测试rename过程,并不直接运行,可以查看测试效果后,然后再运行。
http://apps.hi.baidu.com/share/detail/16475516 | |||||||||
用户登录
还没有账号?立即注册
用户注册
投稿取消
| 文章分类: |
|
还能输入300字
上传中....
恺撒(教主)