我必须提出一个解决方案,删除所有文件,但最新的2在我们自己的云目录结构中。确切地说 - 它是文件版本控制文件夹。一个文件夹中有一些文件具有以下结构:
Filename.Ext.v[random_Number]
困难的部分是我需要保留一个文件夹中的不同文件。
IE:文件夹A的内容:
在这种情况下,我们有3个“基本文件”。而且我必须保留每个“basefile”的最新2个文件。
我尝试使用os.walk
和regex
的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)
答案 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
这将生成一个包含每组最新两个文件的列表。