E. *_*RAL 5 command-line bash files batch-rename
我在 Ubuntu 16.04 的同一文件夹中有数百个.txt文件的集合,它们以字符串和索引号命名,如下所示:
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
...
Run Code Online (Sandbox Code Playgroud)
我必须从数字小于 10 的每个.txt 文件中删除0(零),所以最后我将有:
instead of : a01_s01_e01_skeleton.txt
it will be: a1_s1_e1_skeleton.txt #notice that the 0s are gone.
Run Code Online (Sandbox Code Playgroud)
编辑
数字的位置总是相同的,就像在示例中一样。文件具有顺序逻辑,因此重命名过程必须完全正确。
我怎么能用命令行做到这一点?
使用 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)
Run Code Online (Sandbox Code Playgroud)
rename
可能是也可能不是 perl 版本。在我的系统上它被调用file-rename
,它有一个替代符号链接作为/usr/bin/rename
好吧,只是为了好玩,毫无疑问有更短的 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))
Run Code Online (Sandbox Code Playgroud)
rename_stuff.py
以目录为参数运行它:
python3 /path/to/rename_stuff.py </directory/with/files>
Run Code Online (Sandbox Code Playgroud)与往常一样,首先尝试使用示例目录。
读取目录中的文件:
for f in os.listdir(dr):
Run Code Online (Sandbox Code Playgroud)用“_”分割名称:
sections = f.split("_")
Run Code Online (Sandbox Code Playgroud)在前三个部分,将两个(或更多)位数字替换为其 int-(“实数”)值,因此 01 -> 1, 10 -> 10, 020 -> 20, 000300 -> 300 等等.
随后,再次将这些部分粘在一起:
newname = "_".join(
[s[0] + str(int(s[1:])) for s in sections[:3]] + [sections[-1]]
)
Run Code Online (Sandbox Code Playgroud)使用从包 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
Run Code Online (Sandbox Code Playgroud)
让我们调用 shellscriptrenamer
并赋予它执行权限。
如果要删除的零前面是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
Run Code Online (Sandbox Code Playgroud)
运行 shell 脚本
$ ./renamer
Run Code Online (Sandbox Code Playgroud)
检查结果
$ 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
$
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1048 次 |
最近记录: |