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

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

我收藏了数百件。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'

相关内容