侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

详解Linux系统中rename命令的使用方法

linux  /  管理员 发布于 7年前   502

Dos/Windows下,对文件改名用rename。而书上说,Linux下对文件或目录改名该用mv。我一直也是这样做的,却忽略了Linux下也有个叫rename的命令。都是rename,但功能上就有点差异了。Linux下的rename更像批量改名的工具,是util-linux套件中提供的。

从mv和rename命令的man文档中,可以看到如下信息:

复制代码代码如下:
mv - move (rename) files
rename - Rename files

也就是说,mv也能用于改名,但不能实现批量处理(改名时,不支持*等符号的),而rename可以。
rename使用的格式:

复制代码代码如下:
$ rename foo foo0 foo?

rename需要提供三个参数,然后才能决定最终结果。
模拟一下man文档的例子,原文件:

复制代码代码如下:
$ for i in `seq 100`;do touch foo$i;done
$ ls

foo1    foo18  foo27  foo36  foo45  foo54  foo63  foo72  foo81  foo90
foo10   foo19  foo28  foo37  foo46  foo55  foo64  foo73  foo82  foo91
foo100  foo2   foo29  foo38  foo47  foo56  foo65  foo74  foo83  foo92
foo11   foo20  foo3   foo39  foo48  foo57  foo66  foo75  foo84  foo93
foo12   foo21  foo30  foo4   foo49  foo58  foo67  foo76  foo85  foo94
foo13   foo22  foo31  foo40  foo5   foo59  foo68  foo77  foo86  foo95
foo14   foo23  foo32  foo41  foo50  foo6   foo69  foo78  foo87  foo96
foo15   foo24  foo33  foo42  foo51  foo60  foo7   foo79  foo88  foo97
foo16   foo25  foo34  foo43  foo52  foo61  foo70  foo8   foo89  foo98
foo17   foo26  foo35  foo44  foo53  foo62  foo71  foo80  foo9   foo99

改名结果:
(红色是没有改动的,蓝色是有改动的一部分)
引用

复制代码代码如下:
$ rename foo foo0 foo?
$ ls

foo01  foo100  foo20  foo30  foo40  foo50  foo60  foo70  foo80  foo90
foo02  foo11   foo21  foo31  foo41  foo51  foo61  foo71  foo81  foo91
foo03  foo12   foo22  foo32  foo42  foo52  foo62  foo72  foo82  foo92
foo04  foo13   foo23  foo33  foo43  foo53  foo63  foo73  foo83  foo93
foo05  foo14   foo24  foo34  foo44  foo54  foo64  foo74  foo84  foo94
foo06  foo15   foo25  foo35  foo45  foo55  foo65  foo75  foo85  foo95
foo07  foo16   foo26  foo36  foo46  foo56  foo66  foo76  foo86  foo96
foo08  foo17   foo27  foo37  foo47  foo57  foo67  foo77  foo87  foo97
foo09  foo18   foo28  foo38  foo48  foo58  foo68  foo78  foo88  foo98
foo10  foo19   foo29  foo39  foo49  foo59  foo69  foo79  foo89  foo99

复制代码代码如下:
$ rename foo foo0 foo??
$ ls

foo001  foo011  foo021  foo031  foo041  foo051  foo061  foo071  foo081  foo091
foo002  foo012  foo022  foo032  foo042  foo052  foo062  foo072  foo082  foo092
foo003  foo013  foo023  foo033  foo043  foo053  foo063  foo073  foo083  foo093
foo004  foo014  foo024  foo034  foo044  foo054  foo064  foo074  foo084  foo094
foo005  foo015  foo025  foo035  foo045  foo055  foo065  foo075  foo085  foo095
foo006  foo016  foo026  foo036  foo046  foo056  foo066  foo076  foo086  foo096
foo007  foo017  foo027  foo037  foo047  foo057  foo067  foo077  foo087  foo097
foo008  foo018  foo028  foo038  foo048  foo058  foo068  foo078  foo088  foo098
foo009  foo019  foo029  foo039  foo049  foo059  foo069  foo079  foo089  foo099
foo010  foo020  foo030  foo040  foo050  foo060  foo070  foo080  foo090  foo100

该例子给出了两种文件批量重命名的用法:
引用
第一个参数:被替换掉的字符串
第二个参数:替换成的字符串
第三个参数:匹配要替换的文件模式

rename支持通配符,基本的通配符有以下几个:
引用
?    可替代单个字符
*    可替代多个字符
[charset]    可替代charset集中的任意单个字符

看看*的作用:
引用
$ rm -f *
$ for i in `seq 100`;do touch foo$i;done
$ rename foo foo0 foo*
$ ls
foo01    foo018  foo027  foo036  foo045  foo054  foo063  foo072  foo081  foo090
foo010   foo019  foo028  foo037  foo046  foo055  foo064  foo073  foo082  foo091
foo0100  foo02   foo029  foo038  foo047  foo056  foo065  foo074  foo083  foo092
foo011   foo020  foo03   foo039  foo048  foo057  foo066  foo075  foo084  foo093
foo012   foo021  foo030  foo04   foo049  foo058  foo067  foo076  foo085  foo094
foo013   foo022  foo031  foo040  foo05   foo059  foo068  foo077  foo086  foo095
foo014   foo023  foo032  foo041  foo050  foo06   foo069  foo078  foo087  foo096
foo015   foo024  foo033  foo042  foo051  foo060  foo07   foo079  foo088  foo097
foo016   foo025  foo034  foo043  foo052  foo061  foo070  foo08   foo089  foo098
foo017   foo026  foo035  foo044  foo053  foo062  foo071  foo080  foo09   foo099

再看看[charset]的作用:
引用

复制代码代码如下:
$ rm -f *
$ for i in `seq 100`;do touch foo$i;done
$ rename foo foo0 foo[9]*
$ ls

foo09   foo099  foo17  foo26  foo35  foo44  foo53  foo62  foo71  foo80
foo090  foo1    foo18  foo27  foo36  foo45  foo54  foo63  foo72  foo81
foo091  foo10   foo19  foo28  foo37  foo46  foo55  foo64  foo73  foo82
foo092  foo100  foo2   foo29  foo38  foo47  foo56  foo65  foo74  foo83
foo093  foo11   foo20  foo3   foo39  foo48  foo57  foo66  foo75  foo84
foo094  foo12   foo21  foo30  foo4   foo49  foo58  foo67  foo76  foo85
foo095  foo13   foo22  foo31  foo40  foo5   foo59  foo68  foo77  foo86
foo096  foo14   foo23  foo32  foo41  foo50  foo6   foo69  foo78  foo87
foo097  foo15   foo24  foo33  foo42  foo51  foo60  foo7   foo79  foo88
foo098  foo16   foo25  foo34  foo43  foo52  foo61  foo70  foo8   foo89

Linux的rename 命令有两个版本,一个是C语言版本的,一个是Perl语言版本的,判断方法:
输入man rename 看到第一行是
RENAME(1) Linux Programmer’s Manual RENAME(1)
这个就是C语言版本的 ---我的就是C语言版本
而如果出现的是
RENAME(1) Perl Programmers Reference Guide RENAME(1)
这个就是Perl版本的了

C语言版本格式:rename 原字符串 新字符串 文件名
样例1:目录test下存在两个文件:a_01、a_02,若需要将文件名中的a替换为b,其他部分保持不变,则
(1) 若当前位于test目录下,则执行 rename a b *
(2) 若当前位于test的父目录,则执行 rename a b test/*

Perl语言版本格式:rename 's/原字符串/新字符串/' 文件名
样例2:题目如样例1,则
(1) 若当前位于test目录下,则执行 rename 's/a/b/' *
(2) 若当前位于test的父目录,则执行 rename 's/a/b' test/*
脚本实现方法:

复制代码代码如下:
find -name "a*" -print |
while read name
do
echo $name
rename 's/a/b/' $name
done


  • 上一条:
    Linux中Samba服务器的编译安装以及配置的宏的写法
    下一条:
    Linux下压缩和优化jpg与png图片的方法
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在Linux系统中使用Iptables实现流量转发功能流程步骤(0个评论)
    • vim学习笔记-入门级需要了解的一些快捷键(0个评论)
    • 在centos7系统中实现分区并格式化挂载一块硬盘到/data目录流程步骤(0个评论)
    • 在Linux系统种查看某一个进程所占用的内存命令(0个评论)
    • Linux中grep命令中的10种高级用法浅析(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-11
    • 2017-07
    • 2017-10
    • 2017-11
    • 2018-01
    • 2018-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-03
    • 2022-04
    • 2022-08
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-06
    • 2023-07
    • 2023-10
    • 2023-12
    • 2024-01
    • 2024-04
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客