Python, удаление всех файлов в папке старше X дней
Я пытаюсь написать python script, чтобы удалить все файлы в папке старше X дней. Это то, что у меня есть до сих пор:
import os, time, sys
path = r"c:\users\%myusername%\downloads"
now = time.time()
for f in os.listdir(path):
if os.stat(f).st_mtime < now - 7 * 86400:
if os.path.isfile(f):
os.remove(os.path.join(path, f))
Когда я запускаю script, я получаю:
Error2 - system cannot find the file specified
,
и он дает имя файла. Что я делаю неправильно?
Ответы
Ответ 1
os.listdir()
возвращает список голой имени файла. У них нет полного пути, поэтому вам нужно объединить его с контуром содержащего каталога. Вы делаете это, когда вы идете, чтобы удалить файл, но не когда вы stat
файл (или когда вы делаете isfile()
).
Самое простое решение - просто сделать это один раз в верхней части цикла:
f = os.path.join(path, f)
Теперь f
- это полный путь к файлу, и вы просто используете f
всюду (измените ваш вызов remove()
, чтобы просто использовать f
).
Ответ 2
Вам также нужно указать путь, или он будет выглядеть в cwd.., что иронически было достаточно, если вы сделали на os.remove
, но не где еще...
for f in os.listdir(path):
if os.stat(os.path.join(path,f)).st_mtime < now - 7 * 86400:
Ответ 3
Я думаю, что новая pathlib вещь вместе с модулем стрелка для дат для более чистого кода.
from pathlib import Path
import arrow
filesPath = r"C:\scratch\removeThem"
criticalTime = arrow.now().shift(hours=+5).shift(days=-7)
for item in Path(filesPath).glob('*'):
if item.is_file():
print (str(item.absolute()))
itemTime = arrow.get(item.stat().st_mtime)
if itemTime < criticalTime:
#remove it
pass
- pathlib позволяет легко перечислить содержимое каталога, получить доступ к таким характеристикам файла, как время создания и получить полные пути.
- стрелка упрощает и упрощает расчеты времени.
Здесь вывод показывает полные пути, предлагаемые pathlib. (Не нужно присоединяться.)
C:\scratch\removeThem\four.txt
C:\scratch\removeThem\one.txt
C:\scratch\removeThem\three.txt
C:\scratch\removeThem\two.txt
Ответ 4
Простой python script для удаления/регистрации/файлов старше 10 дней
#!/usr/bin/python
# run by crontab
# removes any files in /logs/ older than 10 days
import os, sys, time
from subprocess import call
def get_file_directory(file):
return os.path.dirname(os.path.abspath(file))
now = time.time()
cutoff = now - (10 * 86400)
files = os.listdir(os.path.join(get_file_directory(__file__), "logs"))
file_path = os.path.join(get_file_directory(__file__), "logs/")
for xfile in files:
if os.path.isfile(str(file_path) + xfile):
t = os.stat(str(file_path) + xfile)
c = t.st_ctime
# delete file if older than 10 days
if c < cutoff:
os.remove(str(file_path) + xfile)
С помощью __file__
вы можете заменить свой путь.
Ответ 5
хотел бы добавить то, что я придумал, чтобы выполнить эту задачу.
функция вызывается в процессе входа в систему.
def remove_files():
removed=0
path = "desired path"
# Check current working directory.
dir_to_search = os.getcwd()
print "Current working directory %s" % dir_to_search
#compare current to desired directory
if dir_to_search != "full desired path":
# Now change the directory
os.chdir( desired path )
# Check current working directory.
dir_to_search = os.getcwd()
print "Directory changed successfully %s" % dir_to_search
for dirpath, dirnames, filenames in os.walk(dir_to_search):
for file in filenames:
curpath = os.path.join(dirpath, file)
file_modified = datetime.datetime.fromtimestamp(os.path.getmtime(curpath))
if datetime.datetime.now() - file_modified > datetime.timedelta(hours=1):
os.remove(curpath)
removed+=1
print(removed)
Ответ 6
вау, так что если этот скрипт делает то, что я думаю, то я попробую. по сути, я хотел, чтобы из одного каталога было удалено что-либо старше 14 дней, и ему был назначен подстановочный знак (.mov), а другой каталог снова удалил что-либо старше 10 дней с той же самой подстановочной картой (.mov), что имеет смысл? Огромное спасибо.
Ответ 7
Вам нужно использовать if os.stat(os.path.join(path, f)).st_mtime < now - 7 * 86400:
вместо if os.stat(f).st_mtime < now - 7 * 86400:
Я считаю использование os.path.getmtime
более удобным: -
import os, time
path = r"c:\users\%myusername%\downloads"
now = time.time()
for filename in os.listdir(path):
# if os.stat(os.path.join(path, filename)).st_mtime < now - 7 * 86400:
if os.path.getmtime(os.path.join(path, filename)) < now - 7 * 86400:
if os.path.isfile(os.path.join(path, filename)):
print(filename)
os.remove(os.path.join(path, filename))
Ответ 8
Есть сценарий, который удаляет файлы, только если у вас не хватает места, это хорошо подходит для журналов и резервных копий в производственной среде.
Удаление старых файлов в конечном итоге удалит все ваши резервные копии, если новые резервные копии не будут добавлены
https://gist.github.com/PavelNiedoba/811a193e8a71286f72460510e1d2d9e9
Ответ 9
Это удаляет файлы старше 60 дней.
import os
directory = '/home/coffee/Documents'
os.system("find " + directory + " -mtime +60 -print")
os.system("find " + directory + " -mtime +60 -delete")