Подтвердить что ты не робот

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,

и он дает имя файла. Что я делаю неправильно?

4b9b3361

Ответ 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")