我有一个包含15个.jpg文件和15个.pdf文件的文件夹。文件名相同,只是扩展名不同。示例ABC123.jpg和ABC123.pdf。最近几天,我花了大部分时间尝试使用shutil将最旧的.pdf文件移动到新文件夹,然后找到匹配的.jpg文件并将其移动到与.pdf相同的文件夹。我能够移动最早的文件或移动给定类型的所有文件。只是无法获得最古老的特定类型。我尝试将所有.pdfs移至新的folder1,然后将所有.jpgs移至新的folder2,然后将每个文件夹中的最旧的移至一个公共文件夹。但是,它们并不总是匹配。最旧的.jpg可能与最旧的.pdf不同。我敢肯定有一个简单的解决方案,我一直在绕圈工作,直到我再也看不到穿过树林的森林。
答案 0 :(得分:0)
使用os.path.getmtime
函数作为对文件进行排序的键。
import os
def oldest_file(dir, type):
return min([name for name in os.listdir(dir) if name.endswith(type)], key=lambda name: os.path.getmtime(os.path.join(dir, name)))
print(oldest('/your/folder', '.jpg'))
如果您需要搜索整个树,请使用os.walk
而不是os.listdir
:
import os
from itertools import chain
def oldest_file(dir, type):
return min(list(chain(*[[os.path.join(root, file) for file in files if file.endswith(type)] for root, _, files in os.walk(dir)])), key=lambda file: os.path.getmtime(file))
print(oldest('/your/folder', '.jpg'))
我确定您可以处理其余有关移动文件的代码。
答案 1 :(得分:0)
我从this answer找到了oldest_file_in_tree
。
import os
import shutil
def oldest_file_in_tree(rootfolder, extension=".avi"):
return min(
(os.path.join(dirname, filename)
for dirname, dirnames, filenames in os.walk(rootfolder)
for filename in filenames
if filename.endswith(extension)),
key=lambda fn: os.stat(fn).st_mtime)
oldest_pdf = oldest_file_in_tree('/var/somedir', '.pdf')
name = oldest_pdf[:4]
matching_jpg = '{}.jpg'.format(name)
shutil.move("/var/somedir/{}.pdf".format(name), "path/to/new/destination/{}.pdf".format(name))
shutil.move("/var/somedir/{}.jpg".format(name), "path/to/new/destination/{}.jpg".format(name))
答案 2 :(得分:0)
这就是我使它工作的方式。
import os, shutil
import glob
todir = '/var/somedir/'
def oldest_file_in_tree(rootfolder, extension=".pdf"):
return min(
(os.path.join(dirname, filename)
for dirname, dirnames, filenames in os.walk(rootfolder)
for filename in filenames
if filename.endswith(extension)),
key=lambda fn: os.stat(fn).st_mtime)
oldest_g3d = oldest_file_in_tree('/var/somedir/', '.pdf')
name = oldest_pdf[:-4]
matching_jpg = '{}.jpg'.format(name)
shutil.move(oldest_pdf, todir)
shutil.move(matching_jpg, todir)