mv 命令与批量重命名

linux 中文件重命名一般使用 mv 命令来完成。此命令以单个文件为参数将旧文件重命名为一个新的文件。如果要实现批量化重命名操作,用户需要自行编写程序。

实现批量重命名

最简单的实现

 file=$(find ./ -name '*test*')for i in $file;do mv $i ${i//test/data}done

上面的实现中首先使用 find 命令来获取需要批量重命名的文件名并存储到变量 file 中。然后遍历变量内容,使用 bash 中的 pattern substitution 功能来生成新的文件名,以此文件名作为 mv 命令的参数来完成重命名工作。

上述实现相当简单,它其实并不完整。文件名列表、待替换的文件名内容与替换字符串可以通过命令行参数来指定,这样就算是一个完整的功能。

这里使用的 bash 模式替换功能并不常见,可以算作是 bash 的一个技巧。虽然能够解决问题,但总有点奇技淫巧的意味。

使用 awk 的实现

使用 awk 来完成相同的功能时,可以使用 awk 来完成文件名的替换并生成命令,然后调用 system 函数执行命令即可。

下面是一个具体的实现:

#!/usr/bin/gawk -ffunction parse_regex(string, regex_arg,    regex_cmd, sep, array_index)
{if (string == "" ) {return 0}sep = substr(string, 2, 1)if (sep ~! /[[:punct:]]/) {print sep " is invalid" > "/dev/stderr"return 0}array_index = split(string, regex_cmd, sep)regex_arg["cmd"] = regex_cmd[1]regex_arg["regex"] = regex_cmd[2]regex_arg["replace"] = regex_cmd[3]regex_arg["opt"] = regex_cmd[4]return array_index;
}function execute_substitute(string, regex_cmd)
{if (string == "") {return ""}switch (regex_cmd["cmd"]) {case "s":default:if (regex_cmd["opt"] == "g") {gsub(regex_cmd["regex"], regex_cmd["replace"], string)return string} else {sub(regex_cmd["regex"], regex_cmd["replace"], string)return string}}
}BEGIN {if (!parse_regex(ARGV[1], regex_cmd)) {print "invalid regex cmd" ARGV[1] >"/dev/stderr"exit 1}for (i = 2; i < ARGC; i++) {string = execute_substitute(ARGV[i], regex_cmd)if (string != ARGV[i]) { # add single quote to avoid special character problemcmd_buffer = "mv -i -v " "'"ARGV[i]"'" " " "'"string"'"system(cmd_buffer)}}exit 0
}

用户需要在命令行中指定类似于 sed 中的替换命令。这里仅仅实现了 ‘s’ 命令,不过由于时间原因它并不是一个很严格的实现。

程序首先解析用户指定的替换命令,将字符串切割并放到一个哈希数组中。解析成功后首先执行替换,然后使用替换的结果生成命令行,调用 system 执行命令即可完成重命名工作。依次遍历命令行参数中指定的文件名来批量重命名文件。

运行示例如下:

    [longyu@debian:17:00:23] awk $ ./rename.awk 's;awk;gawk;' *"alarm.ggawk分析.md" -> "alarm.gggawk分析.md""anagram.ggawk分析" -> "anagram.gggawk分析""egrep-ggawk分析.md" -> "egrep-gggawk分析.md""ggawksed分析.md" -> "gggawksed分析.md""使用ggawk生成代码的两种不同方式.md" -> "使用gggawk生成代码的两种不同方式.md"

使用 rename 命令

最近发现了一个更为方便的脚本——rename。它是一个 perl 脚本,支持批量重命名工作,并且支持使用 perl 风格的正则替换命令,功能十分强大。

研究发现这个脚本使用了 perl File 模块中的 Rename 功能,更详细的信息请自行百度。

下面是 manual 中的两个示例:

  rename 's/\e.bak$//' *.bak  # 移除当前目录中后缀为 .bak 的文件名的后缀 rename 'y/A-Z/a-z/' *      # 将当前目录中所有文件的文件名中的大写字母转化为小写

该使用哪一种实现呢

在上面的几种实现中,我推荐使用 rename 。需要注意这种批量化操作虽然方便,却可能产生致命的后果,因此执行命令前一定要多测试测试!

linux 中文件批量重命名相关推荐

  1. linux 下文件批量重命名

    1.inux 下单个文件的重命名可以直接用mv进行,比如说将test.txt 修改成test_file1.txt只需要输入 mv xxx.txt test_file.txt 2.当需要大批量修改时可以 ...

  2. python如何对文件进行批量命名-利用Python对文件批量重命名

    由于要用到对无序的文件进行重命名,以下写了一个脚本,进行批量进行重命名. 基本格式是 i.后缀名 (i 循环条件下的数 ) 1 #coding:utf8 2 import os; 3 4 def re ...

  3. linux下好用的文件批量重命名软件

    在windows下好用的文件批量重命名工具很多,例如 TC. 在linux下如果会使用rename命令也是一个强大的技能,但是像我这样rename命令记得不熟的人,就需要使用现成的软件作为工具了. 在 ...

  4. 字幕文件批量重命名脚本 —— Linux

    现在更新博客的速度大大降低了,主要还是认为把自己做的题目传上来对别人和自己的帮助都不是很大.行,废话少说,我们切入正题吧. 刚刚闲来无事,想到之前看番的时候,有些另外下载的字幕会和视频名字不匹配,给观 ...

  5. Linux rename命令 批量重命名

    Linux rename命令 批量重命名 Linux的 rename 命令有两个版本,一个是C语言版本的,一个是Perl语言版本的,早期的Linux发行版基本上使用的是C语言版本的,现在已经很难见到C ...

  6. 教你文件批量重命名技巧,彻底告别手工改名的繁琐

    说起文件重命名,肯定还有在手动一个一个重命名的.别急,今天给大家推荐帮助你批量重命名,一键更改文件名称,摆脱繁杂枯燥的操作,简单实用,一起来看操作步骤. 准备工具在电脑上安装一个[文件批量改名高手]支 ...

  7. 给电脑文件批量重命名和更改后缀名

    给电脑文件批量重命名和更改后缀名 1. 概述 2. 第一种方式(F2+Enter) 3. 第二种方式(Everthing) 4. 用 Everthing 批量更改文件后缀名 4.1 更改"新 ...

  8. java 批量重命名_Java实现文件批量重命名

    Windows操作系统可以实现重命名文件操作,却不能实现批量重命名.本实例实现了批量重命名功能,可以将一个文件夹内同一类型的文件按照一定的规则批量重命名.用户可以给出重命名模板,程序可以根据模板对相应 ...

  9. c语言批量重命图片,图片文件批量重命名的3种方法

    1. 简单重命名,资源管理器 如下,是从数码相机里倒进来的照片,名称是相机自己命名的. 这些照片全是宝贝4岁4月的,我想命名为0404XXX,XXXX为顺序号. 选中所有需要重命名的文件,在第一个(切 ...

最新文章

  1. 你要的2019最全目标检测都在这里啦!
  2. 异步socket的线程分配(C#)
  3. CentOS7.6 Open vSwitch安装
  4. 深入理解html5系列-文本标签
  5. OPA 6 - module(Create Button Test);
  6. 苹果cms仿ZzzFun动漫视频站PC模板
  7. java 动态获取IP地址(城市)
  8. Java中Jedis连接Linux上的Redis出现connect time out(解决方案)
  9. java isdebugenabled_在log4j中,在记录之前检查isDebugEnabled是否可以提高性能?
  10. 联众打码平台接口调用(初版)
  11. 2021年上半年软件设计师下午真题及答案解析
  12. 网络安全技术复习资料
  13. word中插入常用几种公式编辑器
  14. 基于RT-Thread的环境监测装置(含IO口模拟8080时序驱动TFT屏幕)
  15. 2022-2028全球多层共烧基板行业调研及趋势分析报告
  16. Sprite Kit 移动精灵
  17. HEVC编码视频格式
  18. 图片旋转 90、180、270
  19. v8 8.0以上版本中,V8_COMPRESS_POINTERS引发的崩溃
  20. mysql查询同名同姓重名人数,查询与自己同名的人,如何查找重名人数

热门文章

  1. OSGi架构学习与设计
  2. 如何使用java解析json文件并将其写入数据库
  3. 【总结】python sklearn模型中random_state参数的意义
  4. 微信小程中文特殊字符编码与解码
  5. matlab中 rgb2gray() 函数 具体实现
  6. C语言中的* 简单记忆方法
  7. 什么是单例模式以及单例模式的几种实现
  8. 黑苹果驱动板载intel蓝牙
  9. 轩小陌的Python笔记-day16 模块二总结
  10. DP2515国产带SPI接口汽车CAN总线控制器芯片兼容替代MCP2515/MCP2515-I/ST