Linux的rename 命令有两个版本,一个是C语言版本的,一个是Perl语言版本的,早期的Linux发行版基本上使用的是C语言版本的,现在已经很难见到C语言版本的了, 由于历史原因,在Perl语言大红大紫的时候,Linux的工具开发者们信仰Perl能取代C,所以大部分工具原来是C版本的都被Perl改写了,因为 Perl版本的支持正则处理,所以功能更加强大,已经不再需要C语言版本的了。
 
1。如何区分系统里的rename命令是哪个版本的?
 
输入man rename 看到第一行是
RENAME(1) Linux Programmer’s Manual RENAME(1)
那么 这个就是C语言版本的。【我查看系统上应该就是C语言版本的】
而如果出现的是:
RENAME(1)              Perl Programmers Reference Guide              RENAME(1)
这个就是Perl版本的了!
 
两个版本的语法差异:
C语言的,按照man上面的注解,
rename的语法格式是:
rename fromtofile
这个命令有三个参数,分别是from : 修改什么名字,to:改成什么名字,file 需要修改的文件是哪些。
用法示例:
比如,有一批文件,都是以log开头的,log001.txt,  log002.txt ....... 一直到log100.txt
现在想要把这批文件的log全部替换为history
rename  log history log*【C的用法~】
这句命令的意思很明白了,把 以log开头的所有文件中的log字符替换为history
这样替换后的文件是:history001.txt,  history002.txt ..... 一直到history100.txt
rename C语言版本的另一个man示例是把后缀名批量修改,
比如我们要将所有jpeg的后缀名图片文件修改为jpg文件。
rename .jpeg.jpg*.jpeg
这样,所有以.jpeg扩展的后缀名全部被修改为.jpg
现在总结一下:
 
rename C语言版本所能实现的功能:批量修改文件名,结果是每个文件会被用相同的一个字符串替换掉!也就是说,无法实现诸如循环 然后按编号重命名!
 
2。Perl 版本的批量重命名,带有Perl的好处是,你可以使用正则表达式来完成很奇特的功能。
 
perl 版本的参数格式:
rename  perlexprfiles
注意,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) 批量去掉文件名里的空格
Linux文件名本来是不支持空格的,不知道什么时候允许了,当然,在命令行调用文件的时候,空格是很有问题滴,比如你 原来可以直接  mv 
oldfile  newfile  但有空格就不行了 , 得加双引号:mv "oldfile"  "newfile" 或者用反斜杠转移  \[]

,这样还好,但如果你直接把含有空格的图片名引入Latex文档,Latex生成pdf的时候会直接打印出文件名,之前这个问题苦恼了我很久,我生成的
pdf怎么老是出现文件名呢?后来才发现原来是文件名内含有空格的问题!windows系统下生成的文件名是天生含有空格的,虽然很讨厌,但有些惠普扫描
仪生成的图片默认就加入了空格,没有办法,只好去掉他,在系统研究rename命令前,我是用mv 去除空格的。
网上流程的两个去空格的版本:
 
1) tr 版:
find . -type f -name "* *" -print |
while read name; do
na=$(echo $name | tr ' ' '_')
if [[ $name != $na ]]; then
mv "$name" $na
fi
done
这个版本以前我一直用的,不知道哪个网上搜刮来的,当时还没有系统的学习过tr/sed/awk命令。
注解一下,很好理解,find . type f -name "* *" -print 这一句是查找当前目录下所有类型为普通文件的
并且名字之中含有空格的文件,并打印出来,其实find默认就是打印的 这个-print 多余了,然后 通过管道传输给while
循环读取,文件名放到name 变量里,用tr 命令替换空格为下划线。 下面判断如果执行后的名称不相同,使用mv
命令重命名。但这个if判断可有可无,因为find已经查询了所有文件名中含有空格的,那么经过tr 命令后,$na变量肯定不等于$name 变量的。
所以这段代码可以简化:
find . -type f -name "* *" |
while read name; do
na=$(echo $name | tr ' ' '_')
mv "$name" "$na"
done
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就这么简单。
方括号内的空格可以用[:space:]代替,
即可以写成's/[[:space:]]+/_/g'
这里注意,rename 采用的是标准perl正则语法,所以无须将加号转变为反斜杠加号
即+ 不能修改为\+,否则替换失败。
 
还有几个好玩的例子:
比如统一在文件头部添加上hello 
rename         's/^/hello/'       *
统一把.html扩展名修改为.htm
rename          's/.html$/.htm/'      *
统一在尾部追加.zip后缀:
rename          's/$/.zip/'      *
统一去掉.zip后缀:
 
rename          's/.zip$//'      *
 
规则化数字编号名,比如1.jpg, 2.jpg ..... 100.jpg , 现在要使文件名全部三位即1.jpg .... 001.jpg
 
运行两次命令:
 
rename           's/^/00/'          [0-9].jpg     # 这一步把1.jpg ..... 9.jpg 变幻为001.jpg .... 009.jpg
 
rename            's/^/0/'           [0-9][0-9].jpg   # 这一步把10.jpg ..... 99.jpg 变幻为010.jpg ..... 090.jpg
 
Ok ,rename就研究了这么多,暂时不知道如何在rename中引入动态变量,比如$i++
 
我测试过i=0;  rename -n "s/^.*$/$((++i))/"   * 执行后i被自增了1,并非想我想像中那样,可以在每操作一个文件自增一,猜想可能是因为rename批量实现的,导致++i只计算一次!
 
 
 
-n  用来测试rename过程,并不直接运行,可以查看测试效果后,然后再运行。
好了,再次说明一下,你在使用的时候一定要确认一下你语言的版本,我的是C语言版本~
 
RENAME(1)                  Linux Programmer’s Manual                 RENAME(1)
 
功能:
 
 rename from to file...
 
用法:
 
For example, given the files foo1, ..., foo9, foo10, ..., foo278, the commands
              rename foo foo0 foo?
              rename foo foo0 foo??
       will turn them into foo001, ..., foo009, foo010, ..., foo278.
 
And
              rename .htm .html *.htm
       will fix the extension of your html files.
 
下面来看一个例子:

最后再来个实际应用当中的问题,先看下以下的图~

看到了吧,我们想把那个图片文件名中的ad字母换成big【注意:拷贝一份,不能直接替换】,那么想想该怎么做呢,对了,就是用rename~
 
cd /data/openshop_1028/IMG_SERVER/sources/goods/
 
find ./ -name "*_ad.jpg" -exec cp "{}" {}.1 \;
 
find ./ -name "*_ad.jpg.1" -exec renamead.jpg.1 big.jpg {} \;
 
假如要是能够直接替换的话,那就一条命令了:
 
cd /data/openshop_1028/IMG_SERVER/sources/goods/
 
find ./ -name "*_ad.jpg" -exec rename ad big {} \;
 
可以看以下的测试~

参考 http://www.2cto.com/os/201201/117383.html

linux下rename用法--批量重命名的更多相关文章

  1. linux下rename用法--批量重命名 转

    原文地址:https://www.cnblogs.com/hester/p/5615871.html Linux的rename 命令有两个版本,一个是C语言版本的,一个是Perl语言版本的,早期的Li ...

  2. Linux命令行bash批量重命名文件

    本文介绍下,在linux下使用shell批量重命名文件的例子,有需要的朋友参考下吧. 在linux中,重命名文件名,需要用到mv命令.如果需要批量重命名名一批文件,就需要写bash脚本或命令行了. 例 ...

  3. 使用 vim 快速对当前文件夹下的文件批量重命名

    前言 我们在使用 Linux 的时候,有很多种方法可以对文件进行重命名,例如 命令行 下的 mv 命令,或者是使用像 dolphin 这样的图形文件管理器.但是有时候需要对一个文件夹下的所有文件批量重 ...

  4. Mac下命令行批量重命名

    日常中碰到需要批量修改文件名怎么办?嗯,来终端先 案例:将Users/case目录下所有html文件修改为php文件 步骤: 1.进入目标文件夹 $ cd Users/case 2.执行以下命令 $ ...

  5. bat遍历当前目录下的文件,批量重命名

    @echo off setlocal enabledelayedexpansion for %%x in (*) do ( if not "%%x"=="demo.bat ...

  6. rename命令和批量重命名

    本文为转载文章,转发自 https://blog.csdn.net/GGxiaobai/article/details/53507454 早期版本的rename是C语言版本,如今新的Ubuntu中采用 ...

  7. linux下的文件操作——批量重命名

    概述:在日常工作中,我们经常需要对一批文件进行重命名操作,例如将所有的jpg文件改成bnp,将名字中的1改成one,等等.文本主要为你讲解如何实现这些操作 1.删除所有的 .bak 后缀: renam ...

  8. Linux批量重命名文件

    五种方法实现Linux批量重命名文件 Linux批量重命名文件是指对某些特定的文件统一进行重新命名,以改变原来一批文件的名称,这里介绍五种方法来实现. Linux批量重命名文件会涉及到改变一个字母.改 ...

  9. Windows下对文件夹下所有图片批量重命名(附C++,python,matlab代码)

    https://blog.csdn.net/u011574296/article/details/72956446: Windows下对文件夹下所有图片批量重命名(附C++,python,matlab ...

随机推荐

  1. 查看linux网卡硬件名称

    查看linux网卡硬件名称 lspci | grep -i ether

  2. Spring MVC 解决无法访问静态文件和"全局异常处理"

    我们都知道,Spring MVC的请求都会去找controller控制器,若果我们页面中引入了一个外部样式,这样是没效果的, 我们引入样式的时候是通过<like href="...&q ...

  3. 转: 【Java并发编程】之五:volatile变量修饰符—意料之外的问题(含代码)

    转载请注明出处:     volatile用处说明     在JDK1.2之前,Java的内存模型实现总是从主存(即共享内存)读取变量,是不需要进行特别的注意的.而随着JVM的成熟和优化,现在在多线程 ...

  4. JAVA基础第七组(5道题)

    31.题目:将一个数组逆序输出.              1.程序分析:用第一个与最后一个交换. package com.niit.homework1; /** * @author: Annie * ...

  5. 控制结构(9) 管道(pipeline)

    // 上一篇:线性化(linearization) // 下一篇:指令序列(opcode) 最近阅读了酷壳上的一篇深度好文:LINUX PID 1 和 SYSTEMD.这篇文章介绍了systemd干掉 ...

  6. 201521123118《java程序与设计》第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...

  7. 201521123037 《Java程序设计》第5周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. 接口: 接口简而言之是方法声明和常量值的集合,接口中所有的方法默认为public ...

  8. 201521123010 《Java程序设计》第2周学习总结

    1. 本周学习总结 这周学习了在JAVA里各种数据类型的使用.各种运算符的使用.表达是的使用,还初步学习了枚举的用法,也掌握了一些枚举和switch语句结合的用法,还了解了一些字符串类.在实验课上也学 ...

  9. Eclipse rap 富客户端开发总结(14) :rap 图片、数据缓存处理

    一.概述 在进行了 rap 的基本学习之后,您对 rap 的理解是否进入了更高的一个层次呢,个人觉得,对学习 rap 的人来说,进行 rap 的学习是一个探索的过程,在编程中不断的对其进行理解和分析, ...

  10. Vue跨门槛系列之实例的阐述

    学习.使用中结合vue官网的api和教程极佳! 前前篇文章上有提及到vue的简单介绍,详情请戳这里 (初试 Vue.js)  第一部分: 每个 Vue 应用都是通过 Vue 函数创建一个新的 Vue ...