Сценарий для удаления старых файлов (tar) в каталоге, если число превышает 15?

Кто-либо может дать решение для этого, я пытаюсь взять резервное копирование gitlab на другой сервер, сценарий должен удалить старые файлы, если номер документа в каталоге превышает 15?

1
задан 24 February 2017 в 14:50

2 ответа

Diclaimer: я проверил следующие команды с именами файлов, которые содержат пробелы, но не с именами файлов, которые содержат переводы строки. Я подозреваю, что они не будут хорошо работать с именами файлов, содержащими символ новой строки, и будут избегать их использования, если вы подозреваете, что могут быть созданы имена, содержащие их.

Этот подход основан на ctime файла, поэтому, если у файлов есть какие-либо измененные атрибуты, они будут казаться новее, чем время их создания. Только вы можете решить, применимо ли использование ctime в вашей ситуации. Если вы предпочитаете использовать mtime, измените -printf "%C+ %p\n" на -printf "%T+ %p\n" в командах find.

Следующая команда может быть выполнена внутри каталога, содержащего ваши tar-файлы. Это предполагает, что все имена файлов похожи на something.tar. Если имена файлов не имеют этого формата, команду нужно будет изменить, либо изменив -iname '*.tar.' на -iname '*.tar.gz*', если файлы являются файлами .tar.gz, либо удалив всю строку -iname '*.tar.', если вы просто хотите работать с любыми файлами в этом каталоге, независимо от формата имени файла.

find . -mindepth 1 -maxdepth 1 -type f -iname '*.tar' -printf "%C+ %p\n" | sort -n | cut -d ' ' -f 2- | head -n -15 | xargs -I{} echo "{}"

Если это показывает самые старые файлы, за пределами вашего ограничения в 15 файлов, то используйте следующую команду для удаления этих файлов.

find . -mindepth 1 -maxdepth 1 -type f -iname '*.tar' -printf "%C+ %p\n" | sort -n | cut -d ' ' -f 2- | head -n -15 | xargs -I{} rm "{}"

В порядке объяснения:

  • find . -mindepth 1 -maxdepth 1 -type f -iname '*.tar' -printf "%C+ %p\n" перечислит все файлы, заканчивающиеся на .tar в . (текущий каталог), без повторения в подкаталогах. Затем он печатает timastamp ctime, затем пробел и имя файла с последующим символом новой строки.
  • | sort -n сортирует выходные данные find численно, поэтому файлы перечисляются от самого старого к новейшему (по времени).
  • | cut -d ' ' -f 2- удаляет добавленную временную метку, созданную find, но сохраняет порядок файлов, перечисленных в sort.
  • | head -n -15 обрезает нижние 15 элементов с выхода cut.
  • xargs -I{} rm "{}" запускает команду rm для каждого файла, гарантируя, что имя файла не будет разделено пробелами.

Это можно записать в виде bash-скрипта с указанием количества сохраняемых файлов и каталога, в котором они будут работать как переменные в скрипте. Вместо этого можно передать в качестве аргументов каталог и количество сохраняемых файлов, но я не буду здесь это рассматривать.

#!/bin/bash

file_limit=15
dir=/directory/containing/tarfiles

find "$dir" -mindepth 1 -maxdepth 1 -type f -iname '*.tar' -printf "%C+ %p\n" | sort -n | cut -d ' ' -f 2- | head -n -"$file_limit" | xargs -I{} rm "{}"

Если вы сохраните этот скрипт где-нибудь, например, /home/user/trim_old_gits и убедитесь, что вы дали ему права на выполнение. Сценарий можно запустить из командной строки, введя:

/home/user/trim_old_gits

Или изнутри /home/user:

./trim_old_gits

Как упоминалось в , изумительный Джейкоб python answer , использование утилиты cron было бы хорошим способом гарантировать, что это происходит на регулярной основе, если не важно, чтобы файлы были удалены немедленно, или inotifywait, если время более чувствительно . [одна тысяча сто сорок-дв]

2
ответ дан 7 December 2019 в 12:35

Учитывая тот факт, что оба ctime и mtime не гарантия, что Вы на самом деле удаляете самые старые файлы, в зависимости от того, что произошло с промежуточными файлами, сценарий ниже удаляет файлы, превышая произвольное число, в данном каталоге.

(a.o). здесь мы можем читать:

ctime является inode или время изменения файла. ctime обновляется, когда атрибуты файла изменяются, как изменение владельца, изменение разрешения или перемещение файла к другой файловой системе, но будут также обновлены при изменении файла. mtime

mtime является файлом, изменяют время. mtime обновляется при изменении файла. Каждый раз, когда Вы обновляете содержание файла или сохранили файл, mtime обновляется.

Большинство времен ctime и mtime будут тем же, если только атрибуты файла не будут обновлены. В этом случае только ctime обновляется.

Сказав это

Согласно ctime из файла крошечный фоновый сценарий ниже удалит самые старые файлы, если количество файлов превысит число набора. Это Ваше, чтобы решить, является ли это применимой опцией в Вашей ситуации.

Сценарий

#!/usr/bin/env python3
import sys
import os
from operator import itemgetter
import time

dr = sys.argv[1]; n = int(sys.argv[2])

while True:
    time.sleep(3)
    # list files; get the number of files
    files = [os.path.join(dr, f) for f in os.listdir(dr)]; nfiles = len(files)
    if nfiles > n:
        # if nfiles exceeds the threshold, get the number of files to delete
        todel = nfiles - n
        # sort the list by creation date, delete the oldest
        del_list = sorted([
            [f, os.path.getctime(f)] for f in files
            ], key=itemgetter(1))[:todel]
        for f in del_list:
            os.remove(f[0])

Как использовать

  1. Скопируйте сценарий в пустой файл, сохраните его как keep_latest.py
  2. Тестовый прогон сценарий от терминала с путем к Вашему каталогу и количеству (последних) файлов, которые сохранят как аргументы:

    python3 '/path/to/keep_latest.py' '/path/to/directory' 15
    

    удержать последние 15 файлов '/path/to/directory'

  3. Если все хорошо работает, добавьте к Приложениям Запуска: Тире> Приложения Запуска> Добавляет. Добавьте команду:

    python3 '/path/to/keep_latest.py' '/path/to/directory' 15
    

Другие опции

Сценарий выше является одной из многих опций. Если также mtime или ctime был бы достаточен, другая опция будет состоять в том, чтобы использовать inotifywait и заставить его сделать то же как сценарий выше, но только если файл добавлен - перемещен - или скопирован в каталог.

Если точность времени (непосредственное удаление дополнительных файлов) не действительно важна, также команда, выполненная cron был бы хороший вариант.

Если любой цикл inotifywait или сценарий выше был бы более эффективным, будет объект тестирования и сравнения.

Так или иначе используемые ресурсы не были бы практически ни одним.

1
ответ дан 7 December 2019 в 12:35

Другие вопросы по тегам:

Похожие вопросы: