在 Linux 上的外部硬盘上使用 ntfs 分区,我希望能够重命名具有不同大小写的同名目录,以便在 Windows 上使用同一个磁盘。
问题是大写字母可以在目录名称中的任何位置,并且两个目录中都可以有大写字母。我知道如何重命名目录,但不知道如何检查是否存在具有此类特征的目录。
我已经用 python 开发了一个脚本来解决一些问题,因此如果解决方案是用 python 的话会更好,但 bash 也可以这样做。
例如 :
fiRstdiRectory
firSTDirectory
该脚本会将第一个目录重命名为:
firstdirectory_0
答案1
尝试这样做
#!/usr/bin/python
import os
# Collect the names and type (file or directory)
filenames = os.listdir(".")
filetypes = map(lambda x: os.path.isdir(x), filenames)
files = zip(filenames, filetypes)
files = sorted(files, key=lambda x: (x[0].lower(), x[1]))
# Create a set of downcased filenames for quick lookup
files_lower = set()
for f in files:
files_lower.add(f[0].lower())
previous_name = ""
# Rename the files
for f in files:
if f[0].lower() == previous_name.lower() and f[1] is True:
# Find an unused index
c = 0
while True:
f_rename = f[0].lower() + "_" + str(c)
if f_rename.lower() in files_lower:
c += 1
else:
print("renaming %s to %s" % (f[0], f_rename))
os.rename(f[0], f_rename)
files_lower.add(f_rename.lower())
break
previous_name = f[0]
假设目录中有以下条目
$ ls -F
a A/ b/ B/ B_0/ bb/ bB/ Bb/ BB/ c/ d/ D/
换句话说,除了“a”是常规文件外,它们都是目录。运行此脚本将给出以下输出
renaming A to a_0
renaming b to b_1
renaming Bb to bb_0
renaming bB to bb_1
renaming bb to bb_2
renaming d to d_0
目录现在包含以下条目
$ ls -F
a a_0/ B/ B_0/ b_1/ BB/ bb_0/ bb_1/ bb_2/ c/ D/ d_0/
该脚本仅重命名目录(您提到您仅重命名目录)并将重命名的任何内容的名称转换为全部小写(基于您的示例)。它还会小心不要将目录重命名为已经存在的名称(因此在我的示例中 b -> b_1,因为 B_0 已经存在)。
希望这对你有用。