前言
本文档的主题是 “通过一些程序/工具的方式来提高工作效率“
这里是一个假设性的需求
需要修改 大量的文件的文件名称, 比如原来文件名称是 1.txt, 2.txt, ... 100.txt
需要将 1.txt 文件名称更新为 new_1.txt, 2.txt 文件名称更新为 new_2.txt, 依次类推
这里 相关脚本基于 linux/mac, windows 上面需要 稍微作出一些小的调整
这里 主要是 介绍解决问题的思路
批量创建文件
不是这里的重点, 一笔带过, 简单的批量新建文件
master:20231025 jerry$ cat batchNewFiles.sh
rm -rf batchFiles
mkdir batchFiles
for num in {1..100}
do
echo $num >> batchFiles/$num.txt
done
最基础的方式
基于 windows/linux/mac 界面, 一个一个的点击, 更新 1.txt 为 new_1.txt, ...., 100.txt 为 new_100.txt
直到 所有文件更新完成
或者如果提供相关功能 批量选中进行修改, 可以进行 批量重命名
但是 一般的系统上面不一定有这个功能
基于自动化操作软件进行处理
比如 按键精灵, 或者 java 中有 Robot 之类 api 可以操作 鼠标, 键盘
进而 模拟以上 界面操作, 只是容易出现问题, 当然 这里也不是我们 讨论的重点
这里 一笔带过
基于 命令行 的 重命名命令
在 linux/mac 中是 ”mv $sourceFile $targetFile”, 在 windows 中是 “ren $sourceFile $targetFile“
一个一个的从命令行操作
”mv 1.txt new_1.txt” 然后更新 命令内容, 然后 继续执行, 直到所有文件处理完毕
通过各类 文件编辑器 来生成脚本
以上通过命令行, 实际执行的是如下脚本, 那么我们是否可以通过 其他方式生成如下脚本, 然后来批量进行执行呢?
mv 1.txt new_1.txt
mv 2.txt new_2.txt
...
mv 100.txt new_100.txt
我们这里基于普通的 notepad++ 或者 idea 的文本编辑器, 来进行处理
当然 一般的文件编辑器都可以处理, 这里仅仅是 示例
ls 一下, 发现内容如下, 将一下内容 粘贴到 文本编辑器
粘贴到文本编辑器之后内容如下, 我们执行两个替换
将每一个文件名称, 单独到一行, 替换之后内容如下, 达到了我们期望的目的
第二个替换为 将每一个 “文件名”, 替换为 “mv 文件名 新文件名”
这里的替换如下, 可以看到 达到了 我们期望的目的
然后再保存脚本内容, 之后执行 即可实现我们的 批量替换的需求
实际处理如下, vim run.sh 的时候复制粘贴 上面生成的 批量更新名字的内容, 然后再执行, 可以看到所有的文件 均已经更新了名字
通过 node + js 来实现上面的脚本生成
当然 还是上面的思路, 实现也相当简单
新建文件 batchRenameFiles.js, 内容如下
for(var i=1; i<=100; i++) {console.log("mv " + i + ".txt new_" + i + ".txt");
}
然后 node batchRenameFiles.js 执行之后生成命令如下
然后同样是新建 run.sh, 拷贝进脚本的相关内容, 然后执行
可以看到所有的文件 均已经更新了名字
其他编程语言
其他编程语言诸如, c, c++, java, python, scala, bash, dos 实现类似
这里仅仅 简述一些常用的, 如下是 bash 的处理方式
java 版本实现如下
输出如下
基于编程语言的相关 api 直接批量重命名
以上的重命名具体的操作是基于 bash 中的 mv 命令, 来实现文件夹的重命名
而我们这里是通过 各个编程语言提供的 文件操作 api 来实现的这块的处理, 两者是有 性质上的差别
以 node + js 实现重命名的处理
这里需要使用 fs 相关模块的功能
新建 batchRenameFilesByApi.js 内容如下
const fs = require('fs');
for(var i=1; i<=100; i++) {fs.rename("batchFiles/" + i + ".txt", "batchFiles/new_" + i + ".txt", () => {});
}
然后基于 node 执行 batchRenameFilesByApi.js 效果如下, 实现了文件的批量替换
其他编程语言
其他编程语言诸如, c, c++, java, python, scala, bash, dos 实现类似
这里仅仅 简述一些常用的, 如下是 bash 的处理方式
java 版本实现如下
更新之后文件夹下面文件如下
绕过 “mv命令”, “编程语言提供的api“ 来进行重命名的相关处理
这个就是来直接通过 read, write 系统调用 来实现重命名
不使用 具体的语言, 和相关的 api
直接和 linux 操作系统进行对接, 当然 这个也不是 这里的重点, 对于 99% 的人来说, 超纲了
这里 也不细说
引申的其他问题如何解决?
和本文档的需求类似, 也是一个架空的测试需求, 将 1.txt 的内容 和 100.txt 的内容互换, 将 2.txt 的内容 和 99.txt 的内容互换, ... 将 55.txt 的内容 和 56.txt 的内容互换
tips 提示信息
public static void swap(int a, int b) {int tmp = a;a = b;b = tmp;
}
看了本文档之后, 您的读后感?
总结
我们这里仅仅 考虑 章节3 和 章节4, 如果你仔细思考的话
你会发现 章节3 其实就是一个对于 普通编程语言的 命令行输出的一个简单的使用, 然后 配合上 bash 来实现了批量的处理功能, 几乎所有的编程语言一定会 提供一个标准输出 默认向命令行输出信息
章节4 是最基础的对于 文件相关api 的使用, 也是非常简单的东西, 如果你们大学 学过 c语言, 或者 java, 或者 js
那么 这些 常用的 api 是一定基本上都是讲过, 并且 课后也有一些 较为简单的 ”课后作业”
那么是 什么让你在 面对这些需求的时候, 没有往这些方面考虑呢? 其实就是 人的惰性, 又或者说是不会去思考”偷懒”的方式, 你永远看到的是最简单的解决问题的方式, 你没有去思考, 思考一个问题 有很多很多的解决思路, 不同的处理方式 也有对应的优势 劣势
完