如何使用 Bash 脚本删除某个字符出现两次后的所有字符?

如何使用 Bash 脚本删除某个字符出现两次后的所有字符?

目录中有多个文件超过200我想通过删除该字符以及它出现两次后的其余字符来重命名它。

例子:

该目录中的一个文件是

Akouo - Float-H6hQuio26Ww.mp3

我想要一个 bash 脚本,它可以删除第二个连字符及其后的所有字符(扩展名除外)。

最终结果应该是

Akouo - Float.mp3

答案1

重命名您的示例

Akouo - Float-H6hQuio26Ww.mp3

Akouo - Float.mp3

使用

rename 's/-[^-]*\././' Akouo\ -\ Float-H6hQuio26Ww.mp3

如果要使用此架构重命名当前目录中的所有 .mp3 文件,请使用

rename 's/-[^-]*\././' *-*-*.mp3

您可以添加-n试运行选项。

答案2

如果我们假设全部文件有两个或更多连字符,并且所有文件都是 mp3,重命名(在 python 中)只需几行:

hyps = [i for i in range(len(name)) if name[i] == "-"]
name = name[:hyps[1]]+"mp3"

然而,在我看来,脚本应该(没有明确的信息表明这是不必要的)至少考虑到目录有子目录和/或包含的可能性:

  • 隐藏文件
  • 没有扩展名的文件
  • 具有各种扩展名的文件
  • 文件名只有一个、两个以上或没有连字符

以便:

file1-2-3-4-5.txt
a-b-c-d-e
Akouo - Float-H6hQuio26Ww.mp3

变成:

file1-2.txt
a-b
Akouo - Float.mp3

然后脚本就更加详细了:

#!/usr/bin/env python3

import shutil
import os

sourcedir = "/path/to/files"

for root, dirs, files in os.walk(sourcedir):
    for name in files:
        if name.startswith(".") or name.count("-") < 2:
            pass
        else:
            if name.count(".") == 0:
                extension = ""
            else:
                extension = name[name.rfind("."):]
            hyps = [i for i in range(len(name)) if name[i] == "-"]
            newname = name[:hyps[1]].strip()+extension
            shutil.move(root+"/"+name, root+"/"+newname)

将脚本复制到一个空文件中,设置路径到你的目录并保存为rename.py。通过以下命令运行它:

python3 /path/to/rename.py

相关内容