好的,我有点丢球。我试图了解事情是如何运作的。我的计算机上有几个html文件,我试图将其重命名为txt文件。这绝对是一次学习练习。按照说明我使用此代码找到了here:
for file in *.html
do
mv "$file" "${file%.html}.txt"
done
产生了这个错误:
mv:将* .html重命名为* .txt:没有这样的文件或目录
长话短说我最终变得流氓并重命名html文件,以及许多其他非html文件作为txt文件。所以现在我的文件标记为
这可能是一个非常愚蠢的问题但是..有没有办法检查文件是否有两个扩展名,如果是,删除最后一个?还是以其他方式来消除这种混乱?
修改
执行此操作find . -name "*.*.txt" -exec echo {} \; | cat -b
似乎告诉我改变了什么以及它的位置。 cat -b
部分不是必需的,但我喜欢它。这仍然无法解决我的问题。
答案 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()
将采用不带扩展名的文件名称,在您的情况下,它会删除其他扩展程序不想拥有。