用终端替换文件名中的所有冒号

用终端替换文件名中的所有冒号

我的硬盘上有 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."
  1. 将其保存到文件(例如)rename.py。
  2. 更改rootdir为所考虑的最外层目录(使用以 / 开头的完整路径名。不允许使用简写或 ~ 等环境变量)。无需在特殊字符前放置 \ - 例如,如果最外层目录是 /.../My HDD,则放置rootdir = "/.../My HDD"NOT rootdir = "/.../My\ HDD"(请注意“s”)[我之所以这样明确说明,只是因为您可能不熟悉 python。无意冒犯。]
  3. 更改logfile为日志文件的所需位置。最后,此文件将包含重命名的文件列表 - 以供将来参考。
  4. 称呼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

相关内容