您可以更改多个不同的文件名吗?

您可以更改多个不同的文件名吗?

我正在尝试重命名许多音乐文件。这些文件包含空格、大写字母和其他字符,我想用下划线替换空格并删除所有大写字母。有办法吗?我见过更改扩展名和多个几乎相同的文件名,除了几个字母或数字更改,但都不是我想要的。

答案1

一个小的python脚本将递归地执行重命名:

#!/usr/bin/env python3
import os
import shutil
import sys

directory = sys.argv[1]

for root, dirs, files in os.walk(directory):
    for f in files:
        new_f = root+"/"+f.replace(" ", "_").lower()
        f = root+"/"+f
        if f != new_f:
            shutil.move(f, new_f)

在哪里:

  • lower()将降低所有可能的资本。
  • replace(" ", "_")将用下划线替换空格。
  • if f != new_f仅在真正需要时才会重命名文件。
  • shutil.move(f, new_f)实际上将重命名该文件。

如何使用

  • 将脚本复制到空文件中
  • 另存为rename.py
  • 使用目标目录作为参数运行它:

    python3 /path/to/rename.py <directory>
    

笔记

  • 如果目标目录包含空格,请使用引号。
  • 请注意,如果重命名的文件名已经存在,您将遇到名称冲突。

如果发生名称冲突

(例如,如果您已经开始手动重命名)使用下面的版本。

#!/usr/bin/env python3
import os
import shutil
import sys

directory = sys.argv[1]

for root, dirs, files in os.walk(directory):
    for f in files:
        renamed = f.replace(" ", "_").lower() ;new_f = root+"/"+renamed
        old_f = root+"/"+f
        if old_f != new_f:
            n = 1
            while os.path.exists(new_f):
                new_f = root+"/dupe_"+str(n)+"_"+renamed
                n = n+1
            shutil.move(old_f, new_f)

它将再生:

在此处输入图片描述

进入:

在此处输入图片描述




编辑

上面的脚本将重命名文件。从评论中,我了解到你想重命名文件夹同样。只需几行代码就可以完成:

#!/usr/bin/env python3
import os
import shutil
import sys

directory = sys.argv[1]

def name_edit(item, root):
    renamed = item.replace(" ", "_").lower() ;new_item = root+"/"+renamed
    old_item = root+"/"+item
    if old_item != new_item:
        n = 1
        while os.path.exists(new_item):
            new_item = root+"/dupe_"+str(n)+"_"+renamed
            n = n+1
        shutil.move(old_item, new_item)

for root, dirs, files in os.walk(directory):
    for item in files:
        name_edit(item, root)
    for item in dirs:
        name_edit(item, root)

解释

在第二个脚本中,文件重命名的方式被转换为功能,以防止编写两次相同的代码(在两个文件/文件夹上运行它)。随后,脚本首先重命名文件,然后文件夹递归地:

#!/usr/bin/env python3
import os
import shutil
import sys

directory = sys.argv[1]

def name_edit(item, root):
    # in one command, both replace spaces and lower {possible} capitals
    renamed = item.replace(" ", "_").lower()
    # combine directory and (new) file- or folder name
    new_item = root+"/"+renamed
    # combine directory and (old) file- or folder name
    old_item = root+"/"+item
    # if the name was changed, check for possible existing dupes
    # and rename until the name is unique
    if old_item != new_item:
        n = 1
        while os.path.exists(new_item):
            new_item = root+"/dupe_"+str(n)+"_"+renamed
            n = n+1
        # if the file or folder name was changed, apply the change
        shutil.move(old_item, new_item)

for root, dirs, files in os.walk(directory):
    # use os.walk() to find files and folders recursively
    for item in files:
        name_edit(item, root)
    for item in dirs:
        name_edit(item, root)

相关内容