分组和删除文件

时间:2016-03-08 10:46:33

标签: python regex linux bash sorting

我必须提出一个解决方案,删除所有文件,但最新的2在我们自己的云目录结构中。确切地说 - 它是文件版本控制文件夹。一个文件夹中有一些文件具有以下结构:

Filename.Ext.v[random_Number]

困难的部分是我需要保留一个文件夹中的不同文件。

IE:文件夹A的内容:

  • HelloWorld.txt.v123
  • HelloWorld.txt.v555
  • HelloWorld.txt.v666
  • OtherFile.pdf.v143
  • OtherFile.pdf.v1453
  • OtherFile.pdf.v123
  • OtherFile.pdf.v14345
  • YetOtherFile.docx.v11113

在这种情况下,我们有3个“基本文件”。而且我必须保留每个“basefile”的最新2个文件。

我尝试使用os.walkregex的Python3来过滤掉基本名称。我尝试使用find-ctime构建Linux工具。我也可以使用bash。

但我真正的问题更多的是逻辑。你将如何处理这项任务?

编辑2: 在这里我的进步:

import os
from itertools import groupby
directory = 'C:\\Users\\x41\\Desktop\\Test\\'


def sorted_ls(directory):
    mtime = lambda f: os.stat(os.path.join(directory, f)).st_mtime
    return list(sorted(os.listdir(directory), key=mtime))

print(sorted_ls(directory))

for basename, group in groupby(sorted_ls(directory), lambda x: x.rsplit('.')[0]):
    for i in basename:
            finallist = []
            for a in group:
                finallist.append(a)
            print(finallist[:-2])

我快到了。该函数根据mtime值对目录中的文件进行排序。建议的groupby()函数调用我的自定义排序函数。

现在问题是我必须在sort()之前转储groupby(),因为这会重置我的自定义排序。但它现在也返回了比预期更多的群体。

如果我的排序列表如下所示:

['A.txt.1', 'B.txt.2', 'B.txt.1', 'B.txt.3', 'A.txt.2']

我会得到3组。 A,B和A再次。 有什么建议吗?

最终结果

这是我添加了递归的最终版本:

import os
from itertools import groupby

directory = r'C:\Users\x41\Desktop\Test'

for dirpath, dirs, files in os.walk(directory):
    output = []
    for basename, group in groupby(sorted(files), lambda x: x.rsplit('.')[0]):
        output.extend(sorted(group, key=lambda x: os.stat(os.path.join(dirpath, x)).st_mtime)[:-2])

        for file in output:
            os.remove(dirpath + "\\" + file)

2 个答案:

答案 0 :(得分:0)

这里的逻辑并不是很难,如果这是你唯一要找的东西。

您可以在python字典中按基本名称对文件进行分组,其中键是您的"基本文件名"例如" HelloWorld.txt"并且值是具有相同基本名称的所有文件的列表,这些文件按ctime排序(或根据您定义最新的方式的某个其他时间度量标准),然后从索引2中删除列表中的所有文件相应地。

答案 1 :(得分:0)

您需要先对文件名进行简单排序,使其按字母顺序排列,以使groupby函数正常工作。

对于每个生成的文件组,您可以使用os.stat键进行排序,如下所示:

import os
from itertools import groupby

directory = r'C:\Users\x41\Desktop\Test'
output = []

for basename, group in groupby(sorted(os.listdir(directory)), lambda x: x.rsplit('.')[0]):
    output.extend(sorted(group, key=lambda x: os.stat(os.path.join(directory, x)).st_mtime)[-2:])

print output

这将生成一个包含每组最新两个文件的列表。