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