首页 > 系统相关 >linux下批量重命名目录及子目录下的文件

linux下批量重命名目录及子目录下的文件

时间:2023-07-12 14:00:17浏览次数:49  
标签:重命名 rename exec 子目录 后缀名 linux test type find

一 、加上后缀名

假如只是给当前目录及所有子目录下的文件添加后缀名,使用 findmv 就可以了。

比如把当前及子目录下所有带 _test 后缀的文件加上 .c 后缀
find . -type f -name '*_test' -exec mv {} {}.c \;

  • find . 查找当前及子目录,GNU版本的find也可以省略点号,效果一样。
  • -type f 指定普通文件类型 【-type d 则指定目录】
  • -name '*_test' 指定以 _test 后缀的文件名,* 匹配 0 个或多个字符,这里需要注意的是test后面加星号可以修改test在文件名中间的情况,不加星号则代表它就在文件名末尾
  • 单引号是强引用,保证星号在传递给find 时不会被shell解释,即将字面含义的星号传入find,find后将其解释为通配符。在这里可以使用反斜杠,即 \*_test = '*_test',这里涉及到引用和转义及强弱引用的知识。
    简单来说就是
  1. 反斜线引用单个字符(也称为转义了这个字符)
  2. 单引号引用一串字符
  3. 双引号引用一串字符,但是保留$(美元)、`(反引号)、(反斜线)的特殊含义
    ls *.c 显示所有后缀名为 .c 的文件,但 ls '*.c'显示字面意义上的 *.c文件,星号在这里被引用为字面上的 * 号, 失去其通配的含义
  • -exec 代表 find 的动作(action),语法为 -exec command {} \; 执行command, {} 指示匹配的文件名(路径名),对一些shell来说可能需要引用花括号-exec command '{}' \; 为了表明 -exec 命令的结尾,必须使用分号结束命令,同时为了避免被shell解释,又得加上反斜线 \
  • mv {} {}.c \; 这里 mv 即上面的 command ,{} 指示 find 查找到的路径名
    {}.c 为文件名加上后缀

下面来做个测试

点击查看代码
测试环境
$ Ubuntu 22.04.2 LTS (GNU/Linux 5.15.90.1-microsoft-standard-WSL2 x86_64)

$ touch xx{1,2,3,4,5,6}_test
$ ls
$ xx1_test  xx2_test  xx3_test  xx4_test  xx5_test  xx6_test
$ find -type f -name '*_test'
$ 
./xx4_test
./xx3_test
./xx6_test
./xx1_test
./xx2_test
./xx5_test
$ find . -type f -name '*_test' -exec mv {} {}.c \;
$ ls
$
xx1_test.c  xx2_test.c  xx3_test.c  xx4_test.c  xx5_test.c  xx6_test.c

没有什么问题

-exec的问题是每查找到一个文件,就会执行一次-exec命令,如果查到到六次(上面的情况),就会执行find命令六次,对于操作一小组的文件的简单命令可能没啥问题,但是涉及到大量文件时,效率就比较慢,这时可以将find的输出管道传送到另一个程序,即xargs,这个程序专门处理这种情况。这时,配合rename使用就可以处理更多情况

二、批量修改文件名的任意部分

我的rename程序为Perl版本,提供man rename可以查看版本
像上面那样只是加上后缀名,可以这样
find . -type f -name '*_test' | xargs rename 's/(test)/$1.c/'

  • | 为管道线,将find的输出到管道上再作为rename的输入
  • xargs使得rename程序可以对find查找到的路径名进行操作
  • 's/(test)/$1.c/' Perl版本的正则表达式,s/被替换的字符串/替换时用的字符串/,(test)将字符串包裹起来,然后用后面的$1指代该字符串(在其它正则表达式中,可能是\1而不是$1)

如果想要在_test前面加上log变成_logtest,简单的更改下正则表达式的内容即可
find . -type f -name '*_test' | xargs rename 's/(test)/log$1/'
假如test后面带有数字和后缀名,如_test1.c,_test2.c,_test3.c.....想要将其改成其他后缀名,只需
find . -type f -name '*_test*' | xargs rename 's/(test[0-9]).c)/$1.后缀名/'
这里面有许多花样,取决于对正则表达式的理解程度

进一步阅读:
regular-expressions
Harley Hahns Guide to Unix and Linux
The Linux Command Line

标签:重命名,rename,exec,子目录,后缀名,linux,test,type,find
From: https://www.cnblogs.com/zenglihan/p/17547099.html

相关文章

  • Linux 安装node环境
    nodejs下载地址是:https://nodejs.org/dist/这里有两种方式下载:下载到本地上传到服务器(相比于第二种更麻烦一些)通过wget命令直接下载到linux服务器上1下载node.jswgethttps://nodejs.org/dist/v12.22.12/node-v12.22.12.tar.gz2 解压node.jstar-zxvfnode-v12.2......
  • Linux | 如何复制文件夹到另一个文件夹
    linux系统使用cp命令即可将一个文件夹里面的文件复制到另外一个文件夹里面。这个命令相当于dos下面的copy命令,具体用法是:cp-r源文件目的文件,其中参数r是指连同源文件中的子目录一同拷贝。在linux系统中复制文件我们可以使用cp或copy命令了,我们要复制文件或目录都可以使用它们......
  • Linux -磁盘性能指标
    linux-磁盘IO性能监测手段Linux存储系统I/O栈由文件系统层(filesystemlayer)、通用块层(generalblocklayer)和设备层(devicelayer)构成。其中,通用块层是Linux磁盘I/O的核心。向上,它为访问文件系统和应用程序的块设备提供了标准接口;向下,它将各种异构磁盘设备抽象为一个......
  • linux-chown-解锁文件夹状态
    gitclone之后的仓库文件夹状态显示带锁,表示当前用户无权限执行:sudochownuserNamefileName......
  • Linux下python脚本自启动和定时启动
    一、服务器开机自动运行用root权限编辑以下文件 sudovim/etc/rc.local 编辑启动脚本的命令地址 /usr/bin/python3/path/to/python>/path/to/log 二、定时启动编辑crontab文件 crontab-e 编辑命令 */30****/usr/bin/python3/path/to/python>>/path/to......
  • 查看linux所有开发端口
    netstat-tuln 然后查看服务器的开发端口,这个服务值运营商,如用的阿里云或腾讯云,看是否开发对应端口。 ......
  • 在archlinux命令行下使用wifi
    创建文件/etc/wpa_supplicant.conf并填入如下内容network={ ssid="你的热点名称" psk="热点密码”}示例:network={ ssid="米44" psk="12345678“}创建文件wifi.sh并填入如下内容然后赋予a+x权限sudowpa_supplicant-iwlan0-c'/etc/wpa_supplicant.conf'-B其中,wl......
  • linux shell脚本实现删除连续的空行为一行
     001、awk实现[root@PC1test02]#lsa.txt[root@PC1test02]#cata.txt##测试数据010203040506070809101112131415161718192021222324252627282930##将多个连续的空行压缩为一个空行[root@PC1tes......
  • linux 中sed命令的标签和跳转功能
     001、[root@PC1test02]#lsa.txt[root@PC1test02]#cata.txt##测试数据01020304050607080910[root@PC1test02]#sed':a;N;s/\n//;ta'a.txt##将多行数据转换为一行数据01020304050607080910 命令解释: sed默认只按行......
  • linux基础命令及常用命令总结
    1.ls命令ls命令是最基础的命令之一,作用是列出当前目录下所有的文件和目录。ls命令有很多选项可以使用,比较常用的是-l选项,可以以详细信息的形式列出所有文件和目录的信息。示例:列出当前目录下的所有文件和目录,使用-l选项#ls-i2.cd命令cd命令可以进入指定的目录。在Linux......