Эффективное перечисление файлов старше 3 лет на большом диске с миллионами файлов

Вопрос или проблема

Мне нужно реализовать систему архивирования файлов, которые находятся на диске объемом 35 ТБ более 3 лет, миллионы файлов.

Как я могу внедрить эффективный способ перечисления файлов, старше 3 лет? Есть ли что-то для индексации метаданных файлов в Linux?

Это можно сделать с помощью

find /directory/path -type f -mtime +$((3 * 365))

но это действительно, действительно очень медленно!

Знание назначения этих файлов значительно поможет в поиске решения.

Но, например, у меня есть скрипт, который я использую для создания .metadata файлов в формате JSON для директории, рекурсивно. Он предполагает, что у вас есть папка, такая как ~/database, и в этой папке вы помещаете директорию, для которой хотите создать индекс метаданных.

В данный момент он использует ./db1_data/ для упрощения расширения директории до ./db2_data/ и так далее.

#!/bin/bash

shopt -s globstar

file_list=( ./db1_data/**/* )
meta_dir="./db1_meta"
generation_date=$(date +'%m-%d-%Y at %H:%M:%S')

clear -x
echo -e "\nГенерация JSON метаданных\nПожалуйста, подождите...\n"

if [ ! -d "$meta_dir" ]; then
    mkdir -p "$meta_dir"
    echo "Создана директория: $meta_dir"
fi

for file_path in "${file_list[@]}"; do
    if [[ -f "$file_path" ]]; then
        base_name="${file_path##*/}"
                base_name_without_ext="${base_name%.*}"
        meta_file="$meta_dir/.$base_name_without_ext.metadata"

        if [ -e "$meta_file" ]; then
            echo -e "Файлы уже существуют. Выход...\n" && exit 0
        else
            exiftool -json -All -g -Sort -struct -zip -mPt "$file_path" > "$meta_file" 2>> exif_stderr.log
            echo -e "\nСгенерировано: $generation_date CST" >> "$meta_file"
        fi
    fi
done

[ -s exif_stderr.log ] && echo -e "\nЗавершено с ошибкой(ами): exif_stderr.log." || rm ./exif_stderr.log; echo -e "Метаданные успешно сгенерированы.\n"

exit 0

Отсюда открываются множество возможностей.

Ответ или решение

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

1. Использование метаданных

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

Шаги для генерации индекса

  1. Генерация метаданных. С помощью вашего скрипта, как вы уже делаете, создайте индексы метаданных для всех файлов.

  2. Добавление информации о дате. Убедитесь, что в метаданные включены даты изменения (Modification Date) и, возможно, дата создания (Creation Date), чтобы можно было быстро фильтровать файлы.

  3. Форматирование индекса. Используйте удобный формат (например, JSON или SQLite) для хранения индексированных данных.

Пример

Допустим, вы уже генерируете метаданные в формате JSON. Вы можете модифицировать хранение метаданных так:

exiftool -json -All -g -Sort -struct -zip -mPt "$file_path" | jq '.[] | {filename: .FileName, modificationDate: .FileModifyDate}' >> "$meta_dir/index.json"

2. Поиск старых файлов

После того, как у вас будет индексированный файл с метаданными:

  1. Фильтрация по дате. Просто применяйте jq или другой инструмент для обработки JSON, чтобы найти файлы старше 3 лет.
jq '.[] | select(.modificationDate < ("'"$(date -d "3 years ago" +%Y-%m-%d)""'))' "$meta_dir/index.json"

Этот способ будет намного быстрее, чем обход всей файловой системы с помощью find.

3. Использование специализированных инструментов

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

  • Elasticsearch или Apache Solr: Системы поиска и анализа, которые могут индексировать файлы и метаданные, позволяя значительно ускорить процесс поиска.

  • SQLite: Хранение метаданных в базе данных SQLite позволит вам выполнять быстрые SQL-запросы для поиска по датам.

4. Индексация на уровне системы

Кроме того, если вы хотите использовать системные средства, на Linux могут быть следующие подходы:

  • locate/updatedb: Утилита locate может помочь быстро находить файлы по имени, но не по времени. Она строит базу данных в отдельном процессе, что ускоряет последующий поиск.

  • fsearch: Это десктопное приложение для поиска файлов, которое может быть полезным для интерактивного поиска, но может не подойти для пуздных объемов данных.

Заключение

Используя метаданные и индексацию, вы сможете эффективно находить и обрабатывать файлы старше 3 лет на вашем диске. Предложенные системы анализа и хранения данных существенно упростят задачи управления файлами и позволят избежать замедления системы из-за долгих операций поиска.

Оцените материал
Добавить комментарий

Капча загружается...