【问题标题】:Removing randomly generated file extensions from .jpg files using python使用python从.jpg文件中删除随机生成的文件扩展名
【发布时间】:2023-11-21 00:12:01
【问题描述】:

我最近恢复了一个我不小心删除的文件夹。它有 .jpg 和 .tar.gz 文件。但是,现在所有文件都附加了某种哈希扩展名,并且每个文件都不同。文件夹中有600多个文件。所以示例名称是:

IMG001.jpg.3454637876876978068
IMG002.jpg.2345447786787689769
IMG003.jpg.3454356457657757876

folder1.tar.gz.45645756765876
folder2.tar.gz.53464575678588
folder3.tar.gz.42345435647567

我想要一个可以依次运行的脚本(也许我可以指定扩展名,或者它可以有两次迭代,一次通过 .jpg 文件,另一个通过 .tar.gz)并清理最后一部分的文件名从 .就在数字之前。所以最终的文件名将以 .jpg 和 .tar.gz 结尾

到目前为止我在 python 中所拥有的:

import os

def scandirs(path):
    for root, dirs, files in os.walk(path):
        for currentFile in files:
            os.path.splitext(currentFile)

scandirs('C:\Users\ad\pics')

显然它不起作用。我将不胜感激任何帮助。我也会考虑使用 bash 脚本,但我不知道该怎么做。

【问题讨论】:

  • 你好像在windows上;我怀疑你想要一个 bash 脚本来处理这个问题。

标签: python regex bash scripting batch-rename


【解决方案1】:

shutil.move(currentFile,os.path.splitext(currentFile)[0])

至少我认为...

【讨论】:

    【解决方案2】:

    我会这样做,使用正则表达式:

    import os
    import re
    
    pattern = re.compile(r'^(.*)\.\d+$')
    
    
    def scandirs(path):
        for root, dirs, files in os.walk(path):
            for currentFile in files:
                match = pattern.match(currentFile)
                if match:
                    os.rename(
                        os.path.join(root, currentFile),
                        os.path.join(root, match.groups(1)[0])
                    )
    
    scandirs('C:/Users/ad/pics')
    

    【讨论】:

      【解决方案3】:

      既然你用 标记,我会给你一个答案,将删除目录中所有文件/目录的最后一个扩展名:

      for f in *; do
        mv "$f" "${f%.*}"
      done
      

      【讨论】:

      • 我会在当前目录中运行它吗?
      • @TendekaiMuchenje 是的