![重命名多个 .txt 文件并更改特定位置的某些字符](https://linux22.com/image/1204621/%E9%87%8D%E5%91%BD%E5%90%8D%E5%A4%9A%E4%B8%AA%20.txt%20%E6%96%87%E4%BB%B6%E5%B9%B6%E6%9B%B4%E6%94%B9%E7%89%B9%E5%AE%9A%E4%BD%8D%E7%BD%AE%E7%9A%84%E6%9F%90%E4%BA%9B%E5%AD%97%E7%AC%A6.png)
我收藏了数百件。TXT文件位于 Ubuntu 16.04 中的同一文件夹中,它们以字符串和索引号命名,如下所示:
a01_s01_e01_skeleton.txt
a01_s01_e02_skeleton.txt
a01_s01_e03_skeleton.txt
a01_s02_e01_skeleton.txt
...
a20_s10_e02_skeleton.txt
...
我必须删除0(零)来自每一个.txt 文件中的数字小于 10,所以最后我会得到:
instead of : a01_s01_e01_skeleton.txt
it will be: a1_s1_e1_skeleton.txt #notice that the 0s are gone.
编辑
数字的位置始终相同,如示例中所示。文件具有顺序逻辑,因此重命名过程必须完全正确。
我如何使用命令行来做到这一点?
答案1
使用 perl rename
,您可以删除非数字和数字之间的零。
$ touch a01_s01_e01_skeleton.txt a01_s01_e02_skeleton.txt a01_s01_e03_skeleton.txt a01_s02_e01_skeleton.txt a20_s10_e02_skeleton.txt
$ rename -n 's/(?<=\D)0+(?=\d)//g' *.txt
rename(a01_s01_e01_skeleton.txt, a1_s1_e1_skeleton.txt)
rename(a01_s01_e02_skeleton.txt, a1_s1_e2_skeleton.txt)
rename(a01_s01_e03_skeleton.txt, a1_s1_e3_skeleton.txt)
rename(a01_s02_e01_skeleton.txt, a1_s2_e1_skeleton.txt)
rename(a20_s10_e02_skeleton.txt, a20_s10_e2_skeleton.txt)
rename
可能是也可能不是 perl 版本。在我的系统上它被称为file-rename
它有一个替代符号链接/usr/bin/rename
答案2
好吧,只是为了好玩,毫无疑问有更短的 cli 解决方案,但在 python 中,下面的脚本可以完成工作如果该目录是“平面的”(正如你所说)和其中的所有文件都是可以重命名的有效文件。如果不是,我们需要添加例外,因此我们开始:
import shutil
import sys
import os
dr = sys.argv[1]
for f in os.listdir(dr):
sections = f.split("_")
newname = "_".join(
[s[0] + str(int(s[1:])) for s in sections[:3]] + [sections[-1]]
)
shutil.move(os.path.join(dr, f), os.path.join(dr, newname))
使用方法:
- 将代码复制到一个空文件中,另存为
rename_stuff.py
使用目录作为参数运行它:
python3 /path/to/rename_stuff.py </directory/with/files>
与往常一样,首先在示例目录上尝试。
解释
读取目录中的文件:
for f in os.listdir(dr):
用“_”分割名称:
sections = f.split("_")
在前三个部分中,将两位(或更多)数字替换为其 int(“实际”)值,因此 01 -> 1、10 -> 10、020 -> 20、000300 -> 300 等等。
随后,将各部分重新粘合在一起:
newname = "_".join( [s[0] + str(int(s[1:])) for s in sections[:3]] + [sections[-1]] )
答案3
Shell脚本
使用从包 util-linux 安装的rename
别名rename.ul
,我制作了以下 bash shellscript,我认为它能够为您完成这项工作。
#!/bin/bash
#####################
doer () {
# removes "0" from the string "{parameter}0"
# for example a0 --> a
rename "s/${1}0/$1/" *
}
#####################
# main
#####################
doer a
doer s
doer e
让我们调用shell脚本renamer
并赋予它执行权限。
如果要删除的零前面不是 a、s、e,请doer
在脚本中添加包含这些字母的调用,并修改 shellscript(如果示例文件名未显示实例,则需要替换规范(函数)中的更多详细信息doer
)。
测试
创建并检查“原始”文件
$ touch a01_s01_e01_skeleton.txt a01_s01_e02_skeleton.txt a01_s01_e03_skeleton.txt a01_s02_e01_skeleton.txt a20_s10_e02_skeleton.txt
$ ls -1
a01_s01_e01_skeleton.txt
a01_s01_e02_skeleton.txt
a01_s01_e03_skeleton.txt
a01_s02_e01_skeleton.txt
a20_s10_e02_skeleton.txt
renamer
运行 shell 脚本
$ ./renamer
检查结果
$ ls -1
a1_s1_e1_skeleton.txt
a1_s1_e2_skeleton.txt
a1_s1_e3_skeleton.txt
a1_s2_e1_skeleton.txt
a20_s10_e2_skeleton.txt
renamer
$
答案4
使用嘚:
autoload zmv
zmv 'a(<->)_s(<->)_e(<->)_skeleton.txt' 'a${1#0}_s${2#0}_e${3#0}_skeleton.txt'