Архивация файлов.

Опубликовано beregov.a.e - вт, 05/17/2022 - 14:26

Архивация файлов.
Дано.
  Есть некое приложение, которого создаётся много файлов, в результате обменов с разными системами. Обмены в частности организованы с помощью xml или json. Там как много разных обменов. И интенсивность по некотором может достигать больше 600 тысяч файлов в месяц. При этом размер файла  например 5431 байт и больше. Прямой доступ к этим файлом нужен около квартала. Для надёжности 6 месяцев, далее их можно архивировать и хранить надо около 5 лет. Разработчики реализовали в приложении чтобы файлы складывались определённым образом, а именно  каталог обмена/{входящий,исходящий}/год/месяц/день.
  Поискав в интернете нашёл одно из решений как это можно сделать. Только только оно не подходило к данной ситуации. В частности при использовании tar по умолчанию, не удалялись полные пути к директории. Что создавало определённые неудобства при распаковки архива. В итоге немного подумав что нужно, получилось что требовалось для данной задачи. Было добавлено удаленнее пути к директории . Решение не претендует на то что оно какое-то правильное или самое лучшее, В частности это пример такого как можно сделать и изучив код, вы можете вдохновится и сделать что-то более подходящее для ваших задач. Работает как для linux так и на freebsd. Там разница в использовании программы date.
#!/usr/bin/env bash
months=6
archiv=/каталог c обменами/{входящий,исходящий}/год/месяц/день.
OS=uname
if [ ${OS} == FreeBSD ]; then
  mass=for ((m=0; m < $months; m++)) ; do date -v-${m}m +%Y/%m ; done
elif [ ${OS} == Linux ]; then
  mass=for ((m=0; m < $months; m++)) ; do date -d "-${m} month" "+%Y/%m" ; done
else
  echo 'failed to identify the OS'
  exit
fi

exclude_dates=echo $mass | sed 's![ \t]!\\\|!g'
list_dir=find -E ${archiv} -type d -regex ".*/[0-9]{4}/[0-9]{2}$"  | grep -v ${exclude_dates}
for i in ${list_dir[@]} ; do let "y++" ;done
count_dir=${y}
now_dir=1
for d in ${list_dir}
  do
    echo "${d} files find ${d} -type f | wc -l"
    echo "${now_dir} is ${count_dir} directories"
    tar -C ${d} -cf - . | xz -9 --threads=0 -c > ${d}.tar.xz
    find ${d} -type f -delete
    rm -rf ${d}
    let "now_dir++"
  done

Теги