Простой способ перемещения каталогов, содержащих старые файлы - PullRequest
1 голос
/ 10 марта 2012

Я храню множество (около 1000) папок клиентов в пути / home / Customers / Customer1, / Home / Customers / Customer2, ... и т. Д. Теперь клиенты приходят и уходят, и я не хочу оставлять папки, которые не менялись в течение некоторого времени (например, 2 года) на моем рабочем диске.

Что мне нужно, это простой скрипт, который

a) принять все папки-кандидаты как немедленные (т. Е. Без рекурсии к подпапкам, так как я не хочу разбивать данные клиентов) потомков по заданному пути (например, / home / Customers /);

b) для каждой папки вычисляется самое последнее время изменения;

в) если время модификации какой-либо папки (например, / home / Customers / mycustomer231) превышает, скажем, 1 год, переместите ее по указанному пути (например, /var/backup/oldcustomers).

Какой самый простой способ его реализации?

На каком языке? В баш? Perl? Python? Какой-то другой язык?

Я знаю некоторые основы Bash. Я знаю, что есть способ достичь этого, вложив один find <..> -exec внутрь другого и используя рекомендации этого потока , но полученный код, конечно, не будет выглядеть легким для понимания и поддержки. Я также знаю некоторые основы других упомянутых языков, достаточные для понимания большей части их кода, но без достаточного опыта для написания собственного решения.

(Да, я мог бы потратить месяц + на изучение одного из этих языков, но для решения моей изолированной проблемы цена слишком дорога. Я уверен, что проблема является основной, и люди, которые профессионально работают с большим количеством пользователей / home /, которые удаляли старые записи, уже нашли решение.)

Ответы [ 3 ]

1 голос
/ 10 марта 2012

Чтобы найти все каталоги, измененные 365 дней назад:

$ find /home/customers -maxdepth 1 -type d -mtime +365 -exec stat -c '%y %n' {} \;

Чтобы переместить их на новое место:

$ find /home/customers -maxdepth 1 -type d -mtime +365 -exec mv {} /var/backup/oldcustomers \;
0 голосов
/ 10 марта 2012

Полностью переоформлен по сравнению с bash one liner с использованием find + xargs, но вот быстрый скрипт на python, частично составленный из некоторых других скриптов, которые я написал ранее.Должно работать очень хорошо для ваших целей.

Теперь единственная причина, по которой я приложил усилия, - это ваш комментарий:

Да, я мог бы потратить месяц + на изучение одного изlanguages ​​

Это стоит усилий и окупится очень быстро.Этот сценарий занял около 7 минут, включая несколько тестов.

#!/usr/bin/python
import datetime
import os
import sys
import shutil

SOURCE_PATH = "/home/customers/"
TARGET_PATH = "/home/oldcustomers/"
TIME_THRESHOLD = datetime.timedelta(365)    #days

def get_old_dirs(source_path, time_threshold):
    old_dirs = []
    for root, dirs, files in os.walk(source_path):
        for d in dirs:
            full_path = os.path.join(root, d)
            now = datetime.datetime.now()
            last_modified = datetime.datetime.fromtimestamp(os.stat(full_path).st_mtime)
            delta = now - last_modified
            if (delta) >= time_threshold:
                old_dirs.append((full_path, delta))
        break
    return old_dirs

def move_old_dirs(target_path, source_path, time_threshold, confirm=True):
    dirs = get_old_dirs(source_path, time_threshold)
    print '"old" dirs: %d' % len(dirs)
    if dirs:
        if confirm:
            print "pending moves:"
            for (d, delta) in dirs:
                print "[%s days] %s" % (str(delta.days).rjust(4), d)
            if not raw_input("Move %d directories to %s ? [y/n]: " % (len(dirs), target_path)).lower() in ['y', 'yes']:
                return
        if not os.path.exists(target_path):
            os.makedirs(target_path)
        for (d, delta) in dirs:
            shutil.move(d, target_path)
            print "%s -> %s" % (d, target_path)
        print "moved %d directories" % len(dirs)


def cmdline(args):
    from optparse import OptionParser
    usage = "move_old_dirs [options] <source_dir> <target_dir>"
    default_desc = "%s -> %s [%s]" % (SOURCE_PATH, TARGET_PATH, TIME_THRESHOLD)
    parser = OptionParser(usage)
    parser.add_option("-d", "--days",
                      action="store", type="int", dest="days", default=365,
                      help="How many days old the directory must be to move")
    parser.add_option("--default", default=False,
                    action="store_true", dest="default", 
                    help="Run the default values set in the script: (%s)" % default_desc)   
    parser.add_option("-f", "--force", default=False,
                    action="store_true", dest="force", 
                    help="Dont ask for confirmation")   
    (options, args) = parser.parse_args(args)
    if len(args) == 1 and options.default:
        print "running default: %s" % default_desc
        return move_old_dirs(TARGET_PATH, SOURCE_PATH, TIME_THRESHOLD, confirm=(not options.force))
    elif len(args) == 3:
        return move_old_dirs(args[2], args[1], datetime.timedelta(options.days), confirm=(not options.force))
    print usage
    print "incorrect number of arguments, try -h or --help"
    return 1

if __name__ == "__main__":
    cmdline(sys.argv)

просто добавьте это в некоторый файл (например, move_old_dirs) в PATH, выполните chmod для исполняемого файла и попробуйте.

0 голосов
/ 10 марта 2012

Вы можете использовать find:

find /home/customers -maxdepth 1 -type d -mtime +365 -exec mv '{}' /var/backup/oldcustomers/ \;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...