运维分享|工具rename常用命令详解

2024-08-18 13:28:13 浏览数 (1)

1 背景

近期,领导发布一个要求,在日志存储方面,针对已上线一段时间的工程日志需要打包抽查,由于某个在建设中的项目有一段时间的日志命名不规则,需要调整为一致,方便抽查,以免引起不必要的麻烦。红线不能碰,规则必须遵守。

2 日志文件命名分析

在项目开发前的文件命名规则为XXGJ-YWMK.log,后来由于业务检查(日志文件需要保留至少6个月)而增加上日期,此时日志文件格式为XXGJ-YWMK-YYYYMMDD.log,而近期的日志命名规则则被修改为了[YWXT]-[XXGJ]-[YWMK]-[version]-YYYYMMDD.log,目前最终的日志文件命名规则则为:

代码语言:javascript复制
业务系统-信息工具-业务模块-业务版本-日志类型-日期/时间-日志块

后增加日志文件格式为结尾的日志文件,至于日志文件格式,则无特别要求,可以是 .log结尾,也可以是 .html 结尾,或者其他。

在以往的日志文件中,文件名包含了应用程序名、环境、版本号、日期、时间、日志级别和序列号,以提供丰富的信息来帮助我们快速定位和管理日志文件。当然了,并不是所有的元素都适用于每个场景,我们应该根据实际需要来选择和定制日志文件的命名格式。

3 处理文件思路分析

由于文件在内网,无法拿出来,所以不能在自己熟悉的window环境中操作,电脑虽然没有自带的文件重命名功能,但是可以借助一些组合键来实现多个文件批量重命名的效果,适用于所有文件格式,唯一不好的就是命名规则比较简单。当然,在windows中有很多可以批量命名的小工具,可以自行查找,此处不在赘述。

按照上面的需求,第一时间想到的就是使用 rename 命令来批量修改已生成的日志文件,在Linux中,能这样子操作的姑且这个方式算是一个,先完成领导派发的任务为优先,再做后续的整理博客。所以此时想梳理下这个Linux命令的用法以及我处理的思路。在平时,我们也有使用 mv 命令来对一个文件移动位置或者重新命令。在实际的使用中,我常常使用 mv 命令针对单个文件进行重命名操作,很少针对多个文件使用这个命令;而在批量迁移文件时这个命令就使用多了。

4 命令工具RENAME

4.1 RENAME开发语言

Linux操作系统中的 rename 命令有两个语言版本,一个是C语言版本的,一个是Perl语言版本的。在早期,Linux发行版基本上使用的是C语言版本的,后期在Perl语言盛行时,将此命令改为了Perl语言版本,Perl版本的支持正则处理,所以功能更加强大。

4.2 RENAME开发语言的判定

4.2.1 GNU/Linux

在开源的Linux版本中,一般都是C语言版本,可以从自带命令查询到,一般机器都会自带这个命令,所以可以使用 man rename 命令查看。从命令中可以查询到rename的版本为 util-linux June 2011 RENAME(1) 。如果返回是带有 util-linux 则为C语言版本的(标准C库语言开发,其他命令也可以按照此方式来检查),反之则Perl语言版本。而在如下所示:

代码语言:javascript复制
[root@localhost ~]$ man rename >> rename.txt
[root@localhost ~]$ cat rename.txt | tail -n 1
util-linux         June 2011      RENAME(1)
[root@localhost ~]$ 

当然,也可以使用最简单,也是最原始的方式,查询组件版本,此种方式最为直接、简单、明了。例如:

代码语言:javascript复制
[root@localhost ~]$ rename --version
rename,来自 util-linux 2.23.2
[root@localhost ~]$ 

注意⚠️:在CentOS 7.x的版本中,rename默认为C语言版本。目前最新版本为6.9.1。在一些其他GUN的Linux版本中,也多数都是C语言版本。

4.2.2 MacOS

一般情况下,我们使用 HomeBrew 管理工具在MacOS中安装工具。

代码语言:javascript复制
# 查找需要安装的软件包
Aion@Macbook ~ $ brew search rename
==> Formulae
pipe-rename     rename ✔        renameutils     remake          runme

==> Casks
a-better-finder-rename     r-name                     tvrenamer
exifrenamer                reamp
metarename                 renamer

### 执行安装操作
Aion@Macbook ~ $ brew install rename
==> Auto-updating Homebrew...
### …… 此处省略安装步骤
To reinstall 1.601, run:
  brew reinstall rename

### 检查安装情况,再次检查即可/或者执行一些命令来检查,例如 rename -v
Aion@Macbook ~ $ brew search rename
==> Formulae
pipe-rename     rename ✔        renameutils     remake          runme

4.2.3 Windows

在windows中可以使用 rename 或者 ren 来操作。

4.2.4 其他操作系统

RENAME命令存在于z/OS、z/VM、OpenVMS、DOS、OS/2、React OS等操作系统中,等同于Unix的 mv 命令。

4.3 确认使用哪一种语言

如何确定是用哪一种语言,按照下面的流程则可以确认使用哪一种语言或者确认操作系统即可使用哪些命令来操作。在使用rename命令时,要谨慎操作,避免误操作导致文件丢失或损坏。在执行rename命令之前,最好先测试一下命令的效果,确保能够正确完成重命名操作。

4.4 匹配规则说明

【常用正则表达式符号说明】

  • ^ 匹配输入的开始位置
  • $ 匹配输入的结尾
  • . 匹配除换行符外的任意字符
  • " " 匹配前一个字符一次或多次 例如,"zo "可以匹配"zoo",但不匹配"z"
  • [a-z] 表示某个范围内的字符,例如,"[a-z]"匹配"a"与"z"之间的任何一个小写字母字符。
  • [^m-z] 否定的字符区间。与不在指定区间内的字符匹配。

5 常用C语言版本命令详解

想要了解RENAME命令的操作,可以先把手册文档打印到控制台或保存到磁盘用来查阅。我一般习惯于保存下,方便查阅。测试文件就不创建了,直接使用目录下面的文件就可以了,下面是拷贝 ./2023/ 文件夹下面所有的日志文件,为 2024-07月份 的日志文件。

代码语言:javascript复制
[root@localhost ~]# rename --help

用法:
 rename [选项] 表达式 替换文件...

选项:
 -v, --verbose    解释正在进行的操作
 -s, --symlink    在符号链接上执行

 -h, --help     显示此帮助并退出
 -V, --version  输出版本信息并退出

更多信息请参阅 rename(1)。
[root@localhost ~]# 

rename特定的语法如下:

-- Linux

rename [options] expression replacement file...

  • options:选项,针对输入、输出定义,可以参考rename --help
  • expression:表达式,一个正则表达式,用于匹配文件名中的部分内容。
  • replacement:替换的内容。即expression匹配到的部分将被替换为replacement
  • file...:文件列表。要进行重命名操作的文件列表,可以使用通配符(如*)来匹配多个文件。

运行图例如下:

创建测试文件,创建 YWXT-1……10.log 的文件,一共10个,如下:

代码语言:javascript复制
[root@localhost dirtest]# 
[root@localhost dirtest]# touch YWXT-{1..10}.log
[root@localhost dirtest]# 
[root@localhost dirtest]# ll
总用量 0
-rw-r--r--. 1 root root 0 8月   7 08:44 YWXT-10.log
-rw-r--r--. 1 root root 0 8月   7 08:44 YWXT-1.log
-rw-r--r--. 1 root root 0 8月   7 08:44 YWXT-2.log
-rw-r--r--. 1 root root 0 8月   7 08:44 YWXT-3.log
-rw-r--r--. 1 root root 0 8月   7 08:44 YWXT-4.log
-rw-r--r--. 1 root root 0 8月   7 08:44 YWXT-5.log
-rw-r--r--. 1 root root 0 8月   7 08:44 YWXT-6.log
-rw-r--r--. 1 root root 0 8月   7 08:44 YWXT-7.log
-rw-r--r--. 1 root root 0 8月   7 08:44 YWXT-8.log
-rw-r--r--. 1 root root 0 8月   7 08:44 YWXT-9.log
[root@localhost dirtest]# 

5.1 批量修改文件名前缀

在C语言中,与Perl语言中的使用方式还不是一样。例如将文件中 YWXT 批量修改为 YWXT-error,如下面的命令,其中使用 -v 命令打印到控制台:

代码语言:javascript复制
[root@localhost dirtest]# rename -v YWXT YWXT-error YWXT-*.log
`YWXT-10.log' -> `YWXT-error-10.log'
`YWXT-1.log' -> `YWXT-error-1.log'
`YWXT-2.log' -> `YWXT-error-2.log'
`YWXT-3.log' -> `YWXT-error-3.log'
`YWXT-4.log' -> `YWXT-error-4.log'
`YWXT-5.log' -> `YWXT-error-5.log'
`YWXT-6.log' -> `YWXT-error-6.log'
`YWXT-7.log' -> `YWXT-error-7.log'
`YWXT-8.log' -> `YWXT-error-8.log'
`YWXT-9.log' -> `YWXT-error-9.log'
[root@localhost dirtest]# 
[root@localhost dirtest]# 
[root@localhost dirtest]# ls
YWXT-error-10.log  YWXT-error-1.log  YWXT-error-2.log  
YWXT-error-3.log  YWXT-error-4.log  YWXT-error-5.log  
YWXT-error-6.log  YWXT-error-7.log  YWXT-error-8.log  
YWXT-error-9.log
[root@localhost dirtest]#

5.2 批量修改文件后缀

可以理解为修改文件的扩展名,这个也是比较常用的。例如将 .log 扩展名修改为 .txt 的扩展名。

代码语言:javascript复制
[root@localhost dirtest]# rename -v .log .txt YWXT-*.log
`YWXT-error-10.log' -> `YWXT-error-10.txt'
`YWXT-error-1.log' -> `YWXT-error-1.txt'
`YWXT-error-2.log' -> `YWXT-error-2.txt'
`YWXT-error-3.log' -> `YWXT-error-3.txt'
`YWXT-error-4.log' -> `YWXT-error-4.txt'
`YWXT-error-5.log' -> `YWXT-error-5.txt'
`YWXT-error-6.log' -> `YWXT-error-6.txt'
`YWXT-error-7.log' -> `YWXT-error-7.txt'
`YWXT-error-8.log' -> `YWXT-error-8.txt'
`YWXT-error-9.log' -> `YWXT-error-9.txt'
[root@localhost dirtest]# 
[root@localhost dirtest]# 
[root@localhost dirtest]# ls
YWXT-error-10.txt  YWXT-error-1.txt  YWXT-error-2.txt  
YWXT-error-3.txt  YWXT-error-4.txt  YWXT-error-5.txt  
YWXT-error-6.txt  YWXT-error-7.txt  YWXT-error-8.txt  
YWXT-error-9.txt
[root@localhost dirtest]# 

5.3 结合通配符批量新增/替换文件名中的字符/字符串

下面就是一个将在 error- 后面,或者 文件序列前面增加一个数字 2,使得所有文件名称变更为

xxx-[固定数字2]xx.txt,此处使用了通配符 ? 和 *,其中?代表单个字符,而 * 代码后续所有字符。上面的方法也可以实现,有兴趣的可以试试。

代码语言:javascript复制
[root@localhost dirtest]# rename -v YWXT-error- YWMK-error-2 YWXT-error-?*
`YWXT-error-10.txt' -> `YWMK-error-210.txt'
`YWXT-error-1.txt' -> `YWMK-error-21.txt'
`YWXT-error-2.txt' -> `YWMK-error-22.txt'
`YWXT-error-3.txt' -> `YWMK-error-23.txt'
`YWXT-error-4.txt' -> `YWMK-error-24.txt'
`YWXT-error-5.txt' -> `YWMK-error-25.txt'
`YWXT-error-6.txt' -> `YWMK-error-26.txt'
`YWXT-error-7.txt' -> `YWMK-error-27.txt'
`YWXT-error-8.txt' -> `YWMK-error-28.txt'
`YWXT-error-9.txt' -> `YWMK-error-29.txt'
[root@localhost dirtest]# 

再举一个例子,可能更好的理解这个命令。这里使用[]占位符来过滤一些字符,例如下面,YWMK-error-2[1]* 实际效果与 YWMK-error-21*一致,避免将 YWMK-error-22、YWMK-error-24等被选中处理。

代码语言:javascript复制
[root@localhost dirtest]# rename -v YWMK-error-2 YWMK-error-3 YWMK-error-2[1]*
`YWMK-error-210.txt' -> `YWMK-error-310.txt'
`YWMK-error-21.txt' -> `YWMK-error-31.txt'
[root@localhost dirtest]# 

6 常用Perl语言版本命令详解

想要了解RENAME命令的操作,可以先把手册文档打印到控制台或保存到磁盘用来查阅。我一般习惯于保存下,方便查阅。测试文件就不创建了,直接使用目录下面的文件就可以了,下面是拷贝 ./2023/ 文件夹下面所有的日志文件,为 2024-07月份 的日志文件。

rename特定的语法

-- MacOS

rename [switches|transforms] [files]

  • switches | transforms:选项,可以参考rename --help
  • file...:文件列表。要进行重命名操作的文件列表,可以使用通配符(如*)来匹配多个文件。

针对switches | transforms 都有说明。

代码语言:javascript复制
Usage:
    rename [switches|transforms] [files]

    Switches:

    ### 查看全部手册
    --man (read the full manual)
    ### 允许从标准输入中读取文件名。
    -0/--null (when reading from STDIN)
    ### 改名后的文件存在时,会覆盖已存在的文件。/ 修改文件名时,需要逐一确认。
    -f/--force or -i/--interactive (proceed or prompt when overwriting)
    -g/--glob (expand "*" etc. in filenames, useful in Windows™ CMD.EXE)
    ### 逆序处理。应用场景是:按正序会有文件名冲突,而逆序没有。
    ### 比如name1-name8,序号加1变为name2-name9。
    -k/--backwards/--reverse-order
    ### 为文件增加软链,文件本身不变。/ 件增加硬链,文件本身不变。理解为复制文件。
    -l/--symlink or -L/--hardlink
    -M/--use=Module
    ### 只打印,不会真正执行。
    -n/--just-print/--dry-run
    -N/--counter-format
    -p/--mkpath/--make-dirs
    --stdin/--no-stdin
    -t/--sort-time
    -T/--transcode=encoding
    ## 打印一切操作。
    -v/--verbose

    Transforms, applied sequentially:

    -a/--append=str
    -A/--prepend=str
    -c/--lower-case
    -C/--upper-case
    -d/--delete=str
    -D/--delete-all=str
    -e/--expr=code
    -P/--pipe=cmd
    -s/--subst from to
    -S/--subst-all from to
    -x/--remove-extension
    -X/--keep-extension
    -z/--sanitize
    --camelcase --urlesc --nows --rews --noctrl --nometa --trim (see manual)

测试数据如下:

代码语言:javascript复制
Aion@Macbook 2023 $ ls
YWMK-v1.0.0-2024-07-1.txt  YWMK-v1.0.0-2024-07-24.txt
YWMK-v1.0.0-2024-07-10.txt YWMK-v1.0.0-2024-07-25.txt
YWMK-v1.0.0-2024-07-11.txt YWMK-v1.0.0-2024-07-26.txt
YWMK-v1.0.0-2024-07-12.txt YWMK-v1.0.0-2024-07-27.txt
YWMK-v1.0.0-2024-07-13.txt YWMK-v1.0.0-2024-07-28.txt
YWMK-v1.0.0-2024-07-14.txt YWMK-v1.0.0-2024-07-29.txt
YWMK-v1.0.0-2024-07-15.txt YWMK-v1.0.0-2024-07-3.txt
YWMK-v1.0.0-2024-07-16.txt YWMK-v1.0.0-2024-07-30.txt
YWMK-v1.0.0-2024-07-17.txt YWMK-v1.0.0-2024-07-31.txt
YWMK-v1.0.0-2024-07-18.txt YWMK-v1.0.0-2024-07-4.txt
YWMK-v1.0.0-2024-07-19.txt YWMK-v1.0.0-2024-07-5.txt
YWMK-v1.0.0-2024-07-2.txt  YWMK-v1.0.0-2024-07-6.txt
YWMK-v1.0.0-2024-07-20.txt YWMK-v1.0.0-2024-07-7.txt
YWMK-v1.0.0-2024-07-21.txt YWMK-v1.0.0-2024-07-8.txt
YWMK-v1.0.0-2024-07-22.txt YWMK-v1.0.0-2024-07-9.txt
YWMK-v1.0.0-2024-07-23.txt

6.1 批量处理前缀

6.1.1 批量增加前缀

将所有的文件增加LOG前缀标识,变为 LOG-XXXXXX 。也可以使用 -v 命令打印到控制台。

代码语言:javascript复制
Aion@Macbook 2023 $ rename 's/^/LOG-/' *

Aion@Macbook 2023 $
Aion@Macbook 2023 $ ls
LOG-YWMK-v1.0.0-2024-07-1.txt  LOG-YWMK-v1.0.0-2024-07-24.txt
LOG-YWMK-v1.0.0-2024-07-10.txt LOG-YWMK-v1.0.0-2024-07-25.txt
LOG-YWMK-v1.0.0-2024-07-11.txt LOG-YWMK-v1.0.0-2024-07-26.txt
LOG-YWMK-v1.0.0-2024-07-12.txt LOG-YWMK-v1.0.0-2024-07-27.txt
LOG-YWMK-v1.0.0-2024-07-13.txt LOG-YWMK-v1.0.0-2024-07-28.txt
LOG-YWMK-v1.0.0-2024-07-14.txt LOG-YWMK-v1.0.0-2024-07-29.txt
LOG-YWMK-v1.0.0-2024-07-15.txt LOG-YWMK-v1.0.0-2024-07-3.txt
LOG-YWMK-v1.0.0-2024-07-16.txt LOG-YWMK-v1.0.0-2024-07-30.txt
LOG-YWMK-v1.0.0-2024-07-17.txt LOG-YWMK-v1.0.0-2024-07-31.txt
LOG-YWMK-v1.0.0-2024-07-18.txt LOG-YWMK-v1.0.0-2024-07-4.txt
LOG-YWMK-v1.0.0-2024-07-19.txt LOG-YWMK-v1.0.0-2024-07-5.txt
LOG-YWMK-v1.0.0-2024-07-2.txt  LOG-YWMK-v1.0.0-2024-07-6.txt
LOG-YWMK-v1.0.0-2024-07-20.txt LOG-YWMK-v1.0.0-2024-07-7.txt
LOG-YWMK-v1.0.0-2024-07-21.txt LOG-YWMK-v1.0.0-2024-07-8.txt
LOG-YWMK-v1.0.0-2024-07-22.txt LOG-YWMK-v1.0.0-2024-07-9.txt
LOG-YWMK-v1.0.0-2024-07-23.txt
Aion@Macbook 2023 $

注意⚠️:此处的批量处理,可以理解一下,并不是指定哪些一定是前缀,哪些一定是后缀,而是根据业务需求,确定前缀、后缀等,此处需要特别注意和理解。例如日期前都可以说是前缀,修改日期前的名称;后缀也可以单指文件后缀名,修改文件类型格式等。

6.1.2 批量修改前缀

修改前缀,本意是替换,或者是更改前缀。将现在已有文件的前缀 LOG- 修改为 YWXT-,增加 -v 参数,则打印执行重命名的过程。

代码语言:javascript复制
Aion@Macbook 2023 $ rename -v 's/LOG-/YWXT-/' *

6.1.3 批量删除前缀

将所有的文件在前缀 YWXT-删除,此处可以理解为 将前缀设置为 空 即可,理解这个思想就好处理。命令如下:

代码语言:javascript复制
Aion@Macbook 2023 $ rename -v 's/YWXT-//' *

处理后的文件如下所示:

6.2 批量增加/修改/删除文件中间部分

在日期前增加文件业务的类型,如info、error、access、console等关键字。rename是修改固定的字符串。例如 将 v1.0.0 替换为 v1.0.0-error

代码语言:javascript复制
Aion@Macbook 2023 $ rename 's/v1.0.0/v1.0.0-error/' *

此时也可以使用更改前缀的方式,例如将 YWMK-v1.0.0- 作为前缀(看做一个整体来处理),更改为 YWMK-v1.0.0-error- 等。

6.3 批量增加/修改/删除后缀

将文件名由原来的 .txt 修改为 .log 文件格式。

代码语言:javascript复制
Aion@Macbook 2023 $ rename 's/.txt/.log/' *
Aion@Macbook 2023 $
Aion@Macbook 2023 $ ls
YWMK-v1.0.0-error-2024-07-1.log  YWMK-v1.0.0-error-2024-07-2.log  YWMK-v1.0.0-error-2024-07-3.log
YWMK-v1.0.0-error-2024-07-10.log YWMK-v1.0.0-error-2024-07-20.log YWMK-v1.0.0-error-2024-07-30.log
YWMK-v1.0.0-error-2024-07-11.log YWMK-v1.0.0-error-2024-07-21.log YWMK-v1.0.0-error-2024-07-31.log
YWMK-v1.0.0-error-2024-07-12.log YWMK-v1.0.0-error-2024-07-22.log YWMK-v1.0.0-error-2024-07-4.log
YWMK-v1.0.0-error-2024-07-13.log YWMK-v1.0.0-error-2024-07-23.log YWMK-v1.0.0-error-2024-07-5.log
YWMK-v1.0.0-error-2024-07-14.log YWMK-v1.0.0-error-2024-07-24.log YWMK-v1.0.0-error-2024-07-6.log
YWMK-v1.0.0-error-2024-07-15.log YWMK-v1.0.0-error-2024-07-25.log YWMK-v1.0.0-error-2024-07-7.log
YWMK-v1.0.0-error-2024-07-16.log YWMK-v1.0.0-error-2024-07-26.log YWMK-v1.0.0-error-2024-07-8.log
YWMK-v1.0.0-error-2024-07-17.log YWMK-v1.0.0-error-2024-07-27.log YWMK-v1.0.0-error-2024-07-9.log
YWMK-v1.0.0-error-2024-07-18.log YWMK-v1.0.0-error-2024-07-28.log rename.log
YWMK-v1.0.0-error-2024-07-19.log YWMK-v1.0.0-error-2024-07-29.log
Aion@Macbook 2023 $

7 其他处理方式

也可以使用shell脚本结合mv命令来手动转换文件名。

方式一

代码语言:javascript复制
for file in *; do  
    mv "$file" "$(echo $file | tr '[:upper:]' '[:lower:]')"  
done

方式二

代码语言:javascript复制
for file in *.txt; do 
  mv "$file" "${file//old/new}"; 
done

总结

本篇主要从Linux和MacOS操作系统中实践了rename命令常用的方式,如何修改文件,如何批量给文件重新命名。rename命令是Linux系统中用于批量重命名文件或目录的强大工具,通过灵活使用正则表达式和替换规则,可以方便地实现各种复杂的重命名操作。然而,在使用时需要注意避免误操作,并确保对命令的行为有充分的理解。


[引用]

  1. rename使用:https://man7.org/linux/man-pages/man2/rename.2.html

0 人点赞