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

时间:2016-03-04 07:42:53

标签: rename batch-rename

好的,我有点丢球。我试图了解事情是如何运作的。我的计算机上有几个html文件,我试图将其重命名为txt文件。这绝对是一次学习练习。按照说明我使用此代码找到了here

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

产生了这个错误:

  

mv:将* .html重命名为* .txt:没有这样的文件或目录

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

  • my_movie.mp4.txt
  • my_song.mp3.txt
  • my_file.txt.txt

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

修改

执行此操作find . -name "*.*.txt" -exec echo {} \; | cat -b似乎告诉我改变了什么以及它的位置。 cat -b部分不是必需的,但我喜欢它。这仍然无法解决我的问题。

1 个答案:

答案 0 :(得分:0)

我不确定终端是否可以“两次”检查扩展程序,但您可以检查每个名称中的.如果.出现多次,则您的文件包含更多内容扩展。然后你可以在向后查找字符串中.的第一次出现时关闭扩展名...或者以正常方式检查字符串中的字符时最后一次出现。

如果你可以使用python,我有一个更快的选择。您可以使用以下内容删除扩展程序:

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

可以从your file.txt.txt your 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()中没有文件夹名称的目录的路径(它已在列表中),所以它会是这样的:

e.g。 os.walk('/home/me/directory') - &gt; 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])

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