有没有办法撤消文件扩展名的批量重命名?
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 文件。所以现在我有标记为
的文件
- my_movie.mp4.txt
- my_song.mp3.txt
- my_file.txt.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.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()
中使用的目录的路径,没有文件夹名称(它已经在列表中)所以它会像这样:
例如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()
将采用不带扩展名的文件名,在您的情况下,这意味着它会去除额外的内容您不想拥有的扩展程序。
好吧,我有点失误了。我试图了解事情是如何运作的。我的计算机上有几个 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 文件。所以现在我有标记为
的文件- my_movie.mp4.txt
- my_song.mp3.txt
- my_file.txt.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.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()
中使用的目录的路径,没有文件夹名称(它已经在列表中)所以它会像这样:
例如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()
将采用不带扩展名的文件名,在您的情况下,这意味着它会去除额外的内容您不想拥有的扩展程序。