Linux rename命令文件重命名的用法汇总

Linux命令中的rename命令主要用于给文件重命名,与mv命令有些类似,但rename可以对批量文件进行重命名,而mv命令则只能对单个文件重命名,下面就给大家详细介绍下Linux rename命令的使用方法吧。

Linux的 rename 命令有两个版本,一个是C语言版本的,一个是Perl语言版本的,早期的Linux发行版基本上使用的是C语言版本的,现在已经很难见到C语言版本的了,由于历史原因,在Perl语言大红大紫的时候,Linux的工具开发者们信仰Perl能取代C,所以大部分工具原来是C版本的都被Perl改写了,因为Perl版本的支持正则处理,所以功能更加强大,已经不再需要C语言版本的了。

  如何区分系统里的rename命令是哪个版本的?

  输入 man rename 看到第一行是

  RENAME(1) Linux Programmer’s Manual RENAME(1)

  那么 这个就是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*

  这句命令的意思很明白了,把 以 log开头的所有文件中的 log字符替换为 history

  这样替换后的文件是: history001.txt, history002.txt …。。 一直到 history100.txt

  rename C语言版本的另一个man示例是把后缀名批量修改,

  比如我们要将所有 jpeg的后缀名图片文件修改为 jpg文件。

  rename .jpeg.jpg*.jpeg

  这样,所有以 .jpeg扩展的后缀名全部被修改为 .jpg

  现在总结一下rename C语言版本所能实现的功能: 批量修改文件名,结果是每个文件会被用相同的一个字符串替换掉!也就是说,无法实现诸如循环 然后按编号重命名!

  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先。

  还有几个比较实用的例子:

  批量去掉文件名里的空格

  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过程,并不直接运行,可以查看测试效果后,然后再运行。

  上面就是Linux下rename命令的用法介绍了,rename命令有两个版本,目前大部分使用的是Perl版本,你在使用该命令的时候要先检查下你使用的是哪个版本,以免出现错误。

时间: 2024-10-15 10:49:47

Linux rename命令文件重命名的用法汇总的相关文章

Linux环境给文件重命名

Linux环境给文件重命名时,如果重命名后的文件名称与当前路径下已存在的文件名称相同,则重命名的文件会覆盖相同名称的文件内容: 例如:新建文件testfile1,内容为mytest: 新建文件testfile2,内容为test: 执行mv testfile1 testfile2  命令后,当前路径只有一个testfile2文件,内容为mytest; 测试同名文件到达处理机制时要注意:

Linux下文件重命名、创建、删除、修改及保存文件

一.重命名(更名) linux 给文件改名的命令是mv命令 mv命令来为文件或目录改名或将文件由一个目录移入另一个目录中.该命令等同于DOS系统下的ren和move命令的组合.它的使用权限是所有用户. 格式mv [options] 源文件或目录 目标文件或目录.主要参数[options]-i:交互方式操作.如果mv操作将导致对已存在的目标文件的覆盖,此时系统询问是否重写,要求用户回答”y”或”n”,这样可以避免误覆盖文件. -f:禁止交互操作.mv操作要覆盖某个已有的目标文件时不给任何指示,指定

Ubuntu Linux 批量修改图片大小以及文件重命名

0x00 本文属于随笔, 仅供作者学习记录. 0x01 批量修改图片大小: [email protected]:~/$ find ./ -name '*.jpg' -exec convert -resize 220X520! {} {} \; 备注: 上述命令中, find 路径 -name 匹配.jpg后缀的文件 -exec 对find结果执行convert命令 后面是convert参数, 如果没有安装convert, sudo apt-get install convert安装即可. -re

Linux编程 5 (目录重命名与移动mv,删除文件rm,目录创建mkdir删除rmdir,查看file,cat,more,tail,head)

一. 文件重命名与移动(mv) 在linux中,重命名文件称为移动(moving).mv命令可以将文件和目录移动到另一个位置或重新命名. 1.1 使用mv重命名 下面在/usr/local下面创建一个空文件为test, 使用mv命令重命名为test1, 查看inode编号和时间将会保持不变,因为mv只影响文件名.如下图所示: 1.2 使用mv移动位置 下面使用mv将 local下的test1文件 移动到/src目录下,inode编号和时间将会保持不变,只是移动了位置,如下图所示: 上图移动文件时

通过DOS命令批量重命名文件

以下为提供的两种方法:遍历当前目录下的所有文件名以.avi结尾的文件,然后权限规则进行修改(规则含义请自行查找资料).第一种方法有缺陷,更改完所有的文件名后,会多改一次.请斟酌使用.第二种方法解决了第一个方法的不足. 方法一: 1 @echo off   2 setlocal enabledelayedexpansion   3    4 for /f "delims="  %%a in ('dir /a-d /s /b *.avi') do (   5     echo "

Linux rename命令

转载:http://blog.csdn.net/sea_shore/article/details/6102437 1.rename命令批量修改文件名, 其实linux下可以使用别的办法来批量修改文件名, 不过rename实在太方便了 比如把所有的表为cdb1_* 修改为cdb_*的在本目录下只需要# rename 'cdb1' 'cdb' * 以前都是写个for循环来做...想想多傻啊, 呵呵 rename还有更多的功能, 建议man rename下 From:http://www.hao32

Linux 常见命令 --文件处理命令

使用 Ctrl+L进行清屏 快捷键 Linux 当中一切皆文件,目录也是文件,我们称之为目录文件,目录文件和普通文件有区别,普通文件是用来保存数据的,而目录是用来保存文件的,目录的概念就是windows中的文件夹的概念 (1)目录处理命名 1.  建立目录: mkdir(make directories) mkdir -p[目录名]   -p  递归创建 2. 切换目录(change directory)  pwd 显示  当前所在的目录 简化操作: cd ~  : 进入当前用户的家目录 cd

Linux常用命令———文件和目录操作命令(18个)

文件和目录操作命令(18个) ls(列出目录内容和属性) 全拼list,功能是列出目录的内容及其内容属性信息. -l(long)              长格式  注:-l 显示的时间是mtime -d --directorys当遇到目录时列出目录本身而非目录内的文件 ls –d   #只显示. (.表示目录本身) ls –d */ #显示当前目录下的目录及其子目录 -r --reverse:            倒序显示(按字母) ls -lrt  #显示最近修改的文件 -R --recu

批量创建用户与批量文件重命名

title: 批量创建用户与批量文件重命名 tags: 批量,用户,创建,重命名 批量创建用户与批量文件重命名 1. 批量创建用户 如果需要批量创建用户,且用户名为stu01-stu10,用户密码为随机的10位密码. 1.1 分析解答 如果用户名为stu01的话,我们可以采用for循环,直接变量范围为01-10,密码随机的话我们可以采用系统默认的随机变量RANDOM,因为默认的RANDOM只有5位数字,因此我们可以给它md5加密,然后取其中的8位字符当做密码.当然我们也可以不用循环,直接使用命令