@linux下rename用法--批量重命名@

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.1big.jpg {} \; 

假如要是能够直接替换的话,那就一条命令了:

cd /data/openshop_1028/IMG_SERVER/sources/goods/

find ./ -name "*_ad.jpg" -exec rename ad big {} \;

可以看以下的测试~

其实还可以用脚本,也就是用个循环语句~

#!/bin/sh
#mail:zhuying.jz.137@163.com
for file in `ls ./*_ad.jpg` 
do 
rename=`echo "${file}.1"`
/bin/cp $file $rename
/bin/mv $rename `echo "${rename%ad*}big.jpg"` #这里就是变量的截取新方法,在shell编程课程中会用到此用法。
done

其实关于.*和*的问题我有时候也有点糊涂,例如以下:

[oracle@sor-sys ~]$ echo ${PATH##.*:}
/usr/local/ruby-1.8.7-p330/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/jdk1.6.0_05/bin:/usr/local/maven/bin:/root/bin:/usr/local/jdk1.6.0_05/bin:/home/oracle/bin
[oracle@sor-sys ~]$ echo ${PATH##*:}
/home/oracle/bin

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux批量重命名文件可以使用命令行工具进行操作。常用的命令有: 1. mv命令:可以将一个文件或目录重命名为另一个名称。 例如,将所有以.txt结尾的文件名中的“old”替换为“new”: ``` $ mv *old.txt *new.txt ``` 2. rename命令:可以使用正则表达式批量重命名文件。 例如,将所有以“old”结尾的文件名中的“old”替换为“new”: ``` $ rename 's/old$/new/' *old* ``` 3. sed命令:可以使用正则表达式批量替换文件内容。 例如,将所有以“old”结尾的文件中的“old”替换为“new”: ``` $ sed -i 's/old/new/g' *old* ``` 以上是常用的几种方法,可以根据实际情况选择适合自己的方法。 ### 回答2: 在Linux操作系统中,批量重命名文件是一项非常常见的操作。这个过程可以用许多不同的方法来完成,包括命令行工具和图形界面工具。 命令行工具 在Linux系统中,有许多命令可以用来批量重命名文件。以下是其中一些最常用的命令。 1. mv命令。mv命令可以将文件从一个目录移动到另一个目录,并重命名它们。例如,要将所有以.txt结尾的文件重命名为.doc文件,可以运行以下命令: mv *.txt *.doc 这将把所有以.txt结尾的文件重命名为以.doc结尾的文件。 2. rename命令。rename命令可以用一个表达式来批量重命名文件。例如,要将所有包含字符串“old”并且以.txt结尾的文件重命名为包含字符串“new”并以.doc结尾的文件,可以运行以下命令: rename 's/old/new/' *.txt 这将把所有包含字符串“old”并以.txt结尾的文件都重命名为包含字符串“new”并以.doc结尾的文件。 3. mmv命令。mmv命令可以用正则表达式重命名文件。例如,要将所有以abc开头的文件重命名为以xyz开头的文件,可以运行以下命令: mmv 'abc*' 'xyz#1' 这将把所有以abc开头的文件都重命名为以xyz开头的文件。 图形界面工具 在Linux中,还有一些图形界面工具可以用来批量重命名文件。 1. Thunar文件管理器。Thunar文件管理器是一个轻量级的文件管理器,支持批量重命名文件。要使用它,只需在文件管理器中选择要重命名的文件,然后右键单击它们并选择“重命名”选项。然后,可以使用正则表达式重命名文件。 2. Gnome Commander文件管理器。Gnome Commander文件管理器是一个功能强大的文件管理器,支持高级批量重命名选项。要使用它,只需在文件管理器中选择要重命名的文件,然后在菜单中选择“高级”>“批量重命名”选项。然后,可以使用自定义规则来重命名文件。 总之,Linux系统中有许多不同的方法可以批量重命名文件,每种方法都有自己的优缺点。根据任务的具体要求和个人喜好来选择最适合的解决方案。 ### 回答3: 在Linux系统中,批量重命名文件有多种方法。下面介绍其中比较常用的几种。 1.使用mv命令 在命令行终端中,可以使用mv命令来批量重命名文件。例如,将目录下所有txt文件的扩展名修改为md: ``` $ mv *.txt *.md ``` 其中,*代表任意字符,可以匹配任意数量和任意类型的文件名,和正则表达式类似。上述命令将所有txt文件重命名为md文件。 2.使用rename命令 rename命令可以按照指定的模式批量重命名文件。例如,将目录下所有txt文件重命名为md文件: ``` $ rename 's/\.txt$/.md/' *.txt ``` 其中,s/\.txt$/.md/表示将每个文件名中的.txt替换为.md,$表示匹配文件名末尾。上述命令将所有txt文件重命名为md文件。 3.使用sed命令 sed命令也可以按照指定的模式批量重命名文件,不过需要将命令写入脚本文件。例如,将目录下所有txt文件重命名为md文件: ``` $ echo "s/\.txt$/.md/" > rename.sed $ find . -name "*.txt" -exec sed -i -f rename.sed {} \; $ rm rename.sed ``` 其中,第一行将替换模式写入rename.sed脚本文件;第二行使用find命令查找所有txt文件,并执行sed命令将文件名替换为md文件名;第三行删除脚本文件。上述命令也将所有txt文件重命名为md文件。 总之,批量重命名文件需要结合Linux命令行的特点,使用通配符、正则表达式和替换命令等功能实现。以上三种方法中,第一种最为简单,适用于简单的重命名操作;第二、三种方法可以实现更加复杂的重命名操作,需要一定的命令行基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值