有没有办法撤消文件扩展名的批量重命名?

Is there a way to undo a batch-rename of file extensions?

好吧,我有点失误了。我试图了解事情是如何运作的。我的计算机上有几个 html 文件,我试图将它们重命名为 txt 文件。这完全是一个学习练习。按照说明,我发现 here 使用此代码:

for file in *.html
do
 mv "$file" "${file%.html}.txt"
done

产生了这个错误:

mv: rename *.html to *.txt: No such file or directory

长话短说,我最终变得无赖并将 html 文件以及许多其他非 html 文件重命名为 txt 文件。所以现在我有标记为

的文件

这可能是一个非常愚蠢的问题,但是..有没有办法检查文件是否有两个扩展名,如果有,删除最后一个?或者任何其他方法来消除这个混乱?

编辑

这样做 find . -name "*.*.txt" -exec echo {} \; | cat -b 似乎可以告诉我发生了什么变化以及它位于何处。 cat -b 部分不是必需的,但我喜欢它。不过,这仍然不能解决我损坏的问题。

我不确定终端是否可以检查扩展名 "twice",但您可以检查每个名称中的 .,如果 . 出现不止一次,那么您的文件有更多扩展名。然后,您可以通过在向后查找字符串中第一次出现 . 来切断扩展名……或者如果以正常方式检查字符串中的字符,则可以找到最后一个。

如果你可以使用python,我有一个更快的选择给你。您可以删除扩展名:

for file in list_of_files:
    os.rename(file,os.path.splitext(file)[0])

可以给你从your file.txt.txtyour file.txt

示例:

你写道你的命令告诉你发生了什么变化,所以只要把那些改变的文件转储到一个文件中(每行文件的路径)。然后你可以很容易地 运行 这个:

with open('<path to list>') as f:
    list_of_files = f.readlines()
for file in list_of_files:
    os.rename(file.strip('\n'), os.path.splitext(file.strip('\n'))[0])

如果没有,那么您需要从 python:

获取列表
import os
results = []
for root, folder, filenames in os.walk(<your path to folder>):
    for filename in filenames:
        if filename.endswith('.txt.txt'):
            results.append(os.path.join(root, filename))

这样你就得到了一个以 .txt.txt 结尾的文件列表,就像这样 <your folder>\<path_to_file>

获取您在 os.walk() 中使用的目录的路径,没有文件夹名称(它已经在列表中)所以它会像这样:

例如os.walk('/home/me/directory') -> path='/home/me/' 并且 res 是已经在列表中的项目,看起来像 directory/...

for res in results:
    path = '' # set the path here
    file = os.path.join(path,r)
    os.rename(file, os.path.splitext(file)[0])

根据您要查找的文件,将 if filename.endswith('...') 中的 .txt.txt 更改为您喜欢的任何内容,os.rename() 将采用不带扩展名的文件名,在您的情况下,这意味着它会去除额外的内容您不想拥有的扩展程序。