вторник, 15 января 2008 г.

Удаляем старые файлы и каталоги

Наверно всем известно, что свободное дисковое пространство стремительно заполняется всякой ерундой. На одном из моих серверов, по просьбе трудящихся, был создан каталог, в который эти самые трудящиеся (в основном отдел маркетинга) клали свои файлы и давали на них ссылки своим контрагентам. Мою просьбу, периодически чистить каталог, все успешно игнорировали. Нужно было что-то делать с этой файловой помойкой. После недолгих размышлений я написал на Python программку, которая и занимается зачисткой.
Все заинтересованные были предупреждены, что файлы и директории, пролежавшие на сервере больше 30 дней будут удалены. Но есть и постоянные директории, которые не должны удалятся.
Программка вызывается по crontab ежедневно.


#!/usr/bin/env python
# -*- coding: utf8 -*-
#----------------------------------------------------------------------------
# Name: delexpfile.py
# Version: 1.0.4
# Purpose: Delete expired files in directory.
#
# Author: Eugene Klepikov
# E-Mail: klek07@gmail.com
#
# Created: 10.01.2008
# Updated: 14.01.2008
# Copyright: (c) 2008 KlekFox
# Licence: GPL
#----------------------------------------------------------------------------
##
'''
Delete expired files in directory.
Run from cron daily.
'''
import sys, os, datetime
from stat import *
iExpDays=30
dtToday=datetime.date.today()
sPath="/www/files"
arExcludeDirs=('balances', 'prcenter', 'const')
#---------------------------------------------------------------------------
def ekDelExpFiles(Path):
dtFile=0
sPathFile=""
for file in os.listdir(Path):
sPathFile=os.path.join(Path, file)
dtFile=datetime.date.fromtimestamp(os.stat(sPathFile)[ST_CTIME])
#print "Path: ", sPathFile, dtFile.strftime("%d.%m.%Y")
if(os.path.isdir(sPathFile)):
if file in arExcludeDirs: continue
#print "Path is dir: ", sPathFile, datetime.date.fromtimestamp(os.stat(sPathFile)[ST_CTIME])
ekDelExpFiles(sPathFile)
dtDiff=dtToday-dtFile
if(dtDiff.days > iExpDays):
try:
if(os.path.isdir(sPathFile)):
print "Delete Directory: ", sPathFile, datetime.date.fromtimestamp(os.stat(sPathFile)[ST_CTIME])
os.rmdir(sPathFile)
else:
print "Delete File: ", sPathFile, datetime.date.fromtimestamp(os.stat(sPathFile)[ST_CTIME])
os.unlink(sPathFile)
except OSError, msgError:
print msgError
return 0
#---------------------------------------------------------------------------
def main():
print "-----",dtToday.strftime("%d.%m.%Y"),"-----"
ekDelExpFiles(sPath)
return 0

if __name__ == '__main__' :
sys.exit( main() )
#----------------------------------------------------------------------------
#

Некоторые пояснения:
  • iExpDays - через сколько дней файл/директория считается устаревшим.
  • sPath - абсолютный путь к каталогу с файловой помойкой.
  • arExcludeDirs - список директорий, которые не должны обрабатываться.
  • dtToday - экземпляр класса date (пакет datetime), содержит текущую дату.
  • dtFile - экземпляр класса date (пакет datetime), содержит дату файла/директории.
dtDiff=dtToday-dtFile
dtDiff.days - содержит разницу в днях.

Была небольшая заморочка с датой файлов. В Linux, да и во всех *nix, файлы имеют несколько дат: дата создания, дата модификации, дата последнего доступа...
Модуль stat содержит предопределенные константы для работы с файлами:
  • ST_ATIME - дата последнего доступа к файлу.
  • ST_MTIME - дата последней модификации файла.
  • ST_CTIME - зависит от операционной системы: для юниксов содержит дату последнего изменения метаданных, а для виндов - дату создания файла.
Вопрос в том, какую дату использовать ST_CTIME или ST_MTIME?
Тестируя программу, я наткнулся на ситуацию, когда старые файлы не удалялись. Т.е. я создал тестовую директорию и в нее накидал файлов разной давности. Но они не удалялись... Вставил диагностические print-ы и увидел, что при использовании ST_CTIME все файлы датированы датой копирования в тестовую директорию?! При этом ls -l показывает правильную дату создания или модификации фалов. Таким образом для тестирования я использовал ST_MTIME. Но на боевом сервере было решено оставить ST_CTIME.

2 комментария:

Анонимный комментирует...

Hello
cheap generic acomplia
It is like an assurance that acomplia drug will surely work.
[url=http://eriecyam.org/]acomplia overnight[/url]
Acomplia will surely be the suitable drug for you if you are suffering from bad appetite or some thing like that.
http://eriecyam.org/ - order acomplia
The main reason behind it is the effectiveness of the drugs.

Анонимный комментирует...

И все-таки не ясно, из каких соображений выбирался параметр as дата создания. Если, допустим, какие-то файлы я перенесу на другой сервер, "дата создания" у них будет сегодняшняя.