重命名多个 .txt 文件,更改特定位置的某些字符

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)

编辑

数字的位置总是相同的,就像在示例中一样。文件具有顺序逻辑,因此重命名过程必须完全正确。

我怎么能用命令行做到这一点?

gle*_*man 8

使用 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


Jac*_*ijm 6

好吧,只是为了好玩,毫无疑问有更短的 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)

使用:

与往常一样,首先尝试使用示例目录。

解释


sud*_*dus 5

脚本

使用从包 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)