使用 vim 快速对当前文件夹下的文件批量重命名
前言
我们在使用Linux的时候,有很多种方法可以对文件进行重命名,例如 命令行 下的mv命令,或者是使用像dolphin这样的图形文件管理器。但是有时候需要对一个文件夹下的所有文件批量重命名,甚至是递归地重命名当前文件夹下所有以.xxx结尾的文件,这时候你还在手动地一遍遍敲mv命令再一遍遍按 TAB 补全么?
图形化的文件管理器
目前 Linux 社区有好多优质的图形化文件管理器,大多数的风格都与 Windows 大相径庭。就拿我现在用的 KDE 出品的 dolphin 来说,基本上 Windows 能做到的它也可以做到,当然 我没有深究其功能,无法评断好用与否。
但是往往这类文件管理器只能做到一些简单的功能,其出现就是为了那些刚从 Windows 转向 Linux 的人不用付出太多的学习成本,至于好不好用则是见仁见智了。
Vim
vim 已经是一个老生常谈的话题了,不管你用没用过也都应该听说过,毕竟曾经有几百万人在互联网上发问 「如何退出 vim 编辑器」......
那么如何实现批量重命名呢?
先看第一个指令 :read
首先打开 vim (这里我用的是 neovim 两者无差别)

尝试下进入 -命令模式- ,输入
:read !ls

敲一下回车就会发现,vim 把 ls 指令所输出的内容打印到了我们的编辑器中,也就是说,你只需要在命令模式中输入上述指令,便可以将 感叹号 ! 后面的命令的输出内容打印到屏幕上。
不妨再试一下,输入
:read !ls -al

Bingo~
再来看下一个指令 :write
我们先来新建一个文件夹: temp,里面放入一些文件,内容如下:
temp > tree
.
├── a.json
├── b.json
├── c.json
└── dir
├── e.json
└── f.json
# 这里的 tree 只是一个指令,功能是以树形展示目录结构
在 temp 文件夹下输入 vim 来启动 vim,按下 冒号 进入 -命令模式-,输入:
:read !find ./
这将会把当前目录下的所有内容打印出来,包括子文件夹下的内容。

我们现在的目的是要把 所有以 .json 结尾的文件改为 .txt 结尾,使用的命令是 mv。
首先,去掉多余的第一行和目录 ./dir,使用 Ctrl + v 进入 -可视块- 模式,再每一行的最前面加上 mv, 再加一个空格。

之后,便可以再后面新增 更改后的名称,这里如果条目少的话可以手敲,但是如果超过十几行的话就要用到 vim 的 宏 了。
这里简单说明下具体的做法,首先放出按键:
q -> a -> $ -> 5h -> yiw -> $ -> a -> [空格] -> Esc -> p -> a -> .txt -> Esc -> j -> q
一遍一遍试的命令,希望老爷们赏个赞
下面是对每条指令的介绍:
| 指令 | 功能 |
|---|---|
| q | 开始记录 宏 |
| a | 记录宏按键为 a |
| $ | 将光标移动到行尾 |
| 5h | 光标向前移动 5 格 |
| yiw | 复制当前光标所在的单词 |
| $ | 将光标移动到行尾 |
| a | 开始插入 |
| <space> | 插入一个空格 |
| <Esc> | 退回到 -普通- 模式 |
| p | 在光标后粘贴刚才复制的内容 |
| a | 开始插入 |
| .txt | 插入 .txt |
| <Esc> | 退回到 -普通- 模式 |
| j | 光标下移一行 |
| q | 结束录制 宏 |
这样,便实现了下面的效果:

那要怎么执行这几行命令呢?记得我们上面的小标题么?
:write
还是一样,先进入到 -普通- 模式,按一下 冒号 进入 -命令- 模式,输入:
:write !sh
执行一下

虽然改名成功了,但是子目录里的文件全部移动到当前目录下了
(教学事故......)
原因大家也该清楚了,因为 mv 实际上是一个移动文件的指令,我们用它重命名是因为它恰好有这个功能,而在重命名时并没有加目录,所以便会酿成刚刚的惨剧......
没关系,我们再把 e.txt f.txt 移动到 dir 目录下,这次的任务是将 .txt 结尾的文件改成以 .json 结尾。

重复上面的步骤,只是改一下宏命令:
q -> a -> ^ -> f. -> yf. -> $ -> a -> [空格] -> [Esc] -> p -> a -> json -> [Esc] -> j

这回应该没问题了吧,执行一下!
:write !sh

果然,成功改回来了!
使用 vim 快速对当前文件夹下的文件批量重命名的更多相关文章
- C#遍历文件夹下所有文件
FolderForm.cs的代码如下: using System; using System.Collections.Generic; using System.Diagnostics; using ...
- python 替换 文件夹下的 文件名称 及 文件内容
示例效果: 1.替换某文件夹下的 文件夹及子文件夹 的名称 由OldStrDir 变为 NewStrDir: 2.替换某文件夹下的 文件夹及子文件夹 下 所有的文件的名称 由OldStrFile 变为 ...
- java笔试题: ——将e:/source文件夹下的文件打个zip包后拷贝到f:/文件夹下面
将e:/source文件夹下的文件打个zip包后拷贝到f:/文件夹下面 import java.io.*; import java.util.zip.ZipEntry; import java.uti ...
- 【转发】du命令 实现Linux 某个文件夹下的文件按大小排序
1. df -lh 2. du -s /usr/* | sort -rn这是按字节排序 3. du -sh /usr/* | sort -rn这是按兆(M)来排序 4.选出排在前面的10个du -s ...
- java读取文件夹下所有文件并替换文件每一行中指定的字符串
import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.I ...
- python (9)统计文件夹下的所有文件夹数目、统计文件夹下所有文件数目、遍历文件夹下的文件
命令:os 用到的:os.walk os.listdir 写的爬虫爬的数据,但是又不知道进行到哪了,于是就写了个脚本来统计文件的个数 #统计 /home/dir/ 下的文件夹个数 import o ...
- PHP遍历文件夹下的文件和获取到input name的值
<?php$dir = dirname(__FILE__); //要遍历的目录名字 ->当前文件所在的文件夹//$dir='D:\PHP\wamp\www\admin\hosts\admi ...
- java中File类应用:遍历文件夹下所有文件
练习: 要求指定文件夹下的所有文件,包括子文件夹下的文件 代码: package 遍历文件夹所有文件; import java.io.File; public class Test { public ...
- 【转】【Linux】Linux下统计当前文件夹下的文件个数、目录个数
[转][Linux]Linux下统计当前文件夹下的文件个数.目录个数 统计当前文件夹下文件的个数,包括子文件夹里的 ls -lR|grep "^-"|wc -l 统计文件夹下目录的 ...
- linux 压缩当前文件夹下所有文件
linux zip压缩.压缩当前文件夹下所有文件,压缩为a.zip.命令行的方法是怎样. zip -r fileName.zip 文件夹名 tar tar命令可以用来压缩打包单文件.多个文件.单个 ...
随机推荐
- 微信小程序时间戳转为日期格式
通常后台传递过来的都是时间戳,但是前台展示不能展示时间戳.就需要转化了. 功能说明: 微信小程序里,时间戳转化为日期格式,支持自定义. 拷贝至项目utils/utils.js中,并注意在js中声明下: ...
- nodeJs入门的第一节课
nodejs是什么? nodejs的架构模式以及优缺点 nodejs异步IO nodejs事件驱动 nodejs单线程 nodejs应用场景 一.nodejs是什么? 1.1nodejs是一个开源的. ...
- 联机算法和脱机算法[Alg_001]
一.联机算法 1.定义 也叫在线算法,在算法执行过程中的任意时刻,只对要操作的数据进行一次扫描,扫描完成后便此后不再对已经操作过的数据进行保存和记忆. 这种算法有种特点:如果数据是储存在磁盘或者磁 ...
- 什么是机器学习的分类算法?【K-近邻算法(KNN)、交叉验证、朴素贝叶斯算法、决策树、随机森林】
1.K-近邻算法(KNN) 1.1 定义 (KNN,K-NearestNeighbor) 如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类 ...
- 手把手带你撸一把springsecurity框架源码中的认证流程
提springsecurity之前,不得不说一下另外一个轻量级的安全框架Shiro,在springboot未出世之前,Shiro可谓是颇有统一J2EE的安全领域的趋势. 有关shiro的技术点 1.s ...
- 实现WebMvcConfigurer接口扩展Spring MVC的功能
前言: 先查看WebMvcConfigurer接口中都定义了哪些内容 public interface WebMvcConfigurer { default void configurePathMat ...
- C语言求最大公约数最小公倍数(多种方法)
前言 这个求解方式多样化,灵活变动,但是,网上没有很好的资源和很全的代码,特此练习,敲打后,总结成本片文章. 单一求解 一.最大公约数 1.穷举法(最简单求解方式) 利用除法方式用当前的数字不断去除以 ...
- .NET 6 史上最全攻略
欢迎使用.NET 6.今天的版本是.NET 团队和社区一年多努力的结果.C# 10 和F# 6 提供了语言改进,使您的代码更简单.更好.性能大幅提升,我们已经看到微软降低了托管云服务的成本..NET ...
- HCIE笔记-第一节-网络的基本概念
R&S= 路由交换 Datacom =数通 =数据通信 某个设备产生了数据之后,借助整体的网络到达目的地的过程. 网络历史 -- 数通为什么产生? 1946年:世界上第一台计算机诞生.军事 科 ...
- Redis 内存满了怎么办?这样设置才正确!
上回在<Redis 数据过期了会被立马删除么?>说到如果过期的数据太多,定时删除无法删除完全(每次删除完过期的 key 还是超过 25%),同时这些 key 再也不会被客户端请求,就无法走 ...