我的硬盘上有 1 GB 的音乐,并且已使用 EXT4 格式化。我想将这些文件移动到 FAT 格式的硬盘分区。但是,我无法移动大多数文件,因为它们的名称中有“:”(例如,歌剧的名称为“Act 2: .....”)。有没有办法使用命令行将所有文件从“XXXX:XXXX”重命名为“XXXX-XXXX”?
答案1
如果所有文件都在一个目录中,请尝试:
rename 's|:|-|g' *
(如果您愿意,可以将其中 * 更改为更具限制性的内容)
如果目录树中有许多文件,请从树的底部尝试以下操作:
find . -name "*:*" -exec rename 's|:|-|g' {} \;
-n
您可以立即添加选项,rename
让它告诉您它将做什么,而无需实际执行。这可能有助于您避免意外踩到其他文件或其他坏东西……
答案2
这是 python 中的一个解决方案,用于处理文件不一定位于同一目录中的情况。
import os
torename = []
rootdir = "The main directory"
logfile = "Path to log file" #Eg: logfile = "/home/prasanth/renamelog"
for (path, dirs, files) in os.walk(rootdir):
for dirname in dirs:
if ':' in dirname:
torename.append(os.path.join(path, dirname))
for filename in files:
if ':' in filename:
torename.append(os.path.join(path, filename))
print "No of files/dirs to rename =", len(torename)
a = raw_input("Continue? (y/n) ")
if a == 'y':
torename.reverse()
for oldname in torename:
directory, filename = os.path.split(oldname)
newname = os.path.join(directory, filename.replace(':', '-'))
command = 'mv %s %s > /dev/null' % (repr(oldname), repr(newname))
os.system(command)
f = open(logfile, 'a')
f.write(oldname + '\n')
f.close()
else:
print "Aborted."
- 将其保存到文件(例如)rename.py。
- 更改
rootdir
为所考虑的最外层目录(使用以 / 开头的完整路径名。不允许使用简写或 ~ 等环境变量)。无需在特殊字符前放置 \ - 例如,如果最外层目录是 /.../My HDD,则放置rootdir = "/.../My HDD"
NOTrootdir = "/.../My\ HDD"
(请注意“s”)[我之所以这样明确说明,只是因为您可能不熟悉 python。无意冒犯。] - 更改
logfile
为日志文件的所需位置。最后,此文件将包含重命名的文件列表 - 以供将来参考。 - 称呼
python rename.py
。
警告:在冒险下载整整 1 GB 的音乐之前,请先对小样本进行测试。
详细信息:重命名是从最内层文件向外进行的。
答案3
上面的答案在我的系统上不起作用。这个答案起作用了。
显示测试运行:
rename -nv ":" "_" *.webp
跑步:
rename ":" "_" *.webp
答案4
我知道这是一篇很老的帖子。AeroGT80 的递归解决方案非常彻底,但速度相当慢。我在一台较慢的服务器上运行了大约半个小时,但只完成了大约一半 - 我认为它大约有 300 个子目录中的 73,000 个文件。
下面的解决方案将运行得更快(它对目录中的所有文件进行操作,而不是逐个文件 - 使用 AeroGT80 的非递归解决方案)。唯一的问题是,它只深入一个目录(因此它不像他的解决方案那样完全递归),但我相信它可以很容易地进行修改。
#!/bin/bash
for D in *; do
if [ -d "${D}" ]; then
#echo "${D}"
pushd "${D}" > /dev/null
rename 's|:|-|g' *
popd > /dev/null
fi
done