Автоматизированное перемещение файлов в архивный каталог.

Прилетела тут задачка переместить по списку 22000 файлов из разных каталогов в архив с частичным сохранением пути. Изначально файлы находятся по таким путям:

/var/www/directory_1/directory_2/directory_3/directory_4/323/290/00000035.avi
/var/www/directory_1/directory_2/directory_3/directory_4/389/121/00000036.avi
/var/www/directory_1/directory_2/directory_3/directory_4/353/92/00000042.avi
/var/www/directory_1/directory_2/directory_3/directory_4/353/92/00000055.avi
/var/www/directory_1/directory_2/directory_3/directory_4/353/281/00000056.avi
/var/www/directory_1/directory_2/directory_3/directory_4/353/281/00000057.avi
/var/www/directory_1/directory_2/directory_3/directory_4/298/167/00000058.avi
/var/www/directory_1/directory_2/directory_3/directory_4/298/167/00000059.avi

т.е. часть пути статична, а последние 2 директории разные, вот их и надо сохранить в архивном каталоге, чтобы  получилось типа:

/var/archive/323/290/00000035.avi
/var/archive/389/121/00000036.avi
/var/archive/353/92/00000042.avi
/var/archive/353/92/00000055.avi
/var/archive/353/281/00000056.avi
/var/archive/353/281/00000057.avi
/var/archive/298/167/00000058.avi
/var/archive/298/167/00000059.avi

Пишем скрипт на bash в котором будем обрабатывать данные из внешнего файла с именем move1.txt. В нём (как в первом примере) прописаны полные пути к файлам, которые нужно переместить в архив. В процессе перемещения пишется лог файл, который можно изучить позже, а так же выводится информация о работе на экран. Итак скрипт:

#!/bin/bash
file="/home/user/move1.txt" #входной файл
arch="/var/archive" #путь к архивному каталогу
log="/home/user/mv.log" #log файл
for var in $(cat $file) #цикл перебирающий строки входного файла
do
res=/$(echo $var | cut -d / -f 8,9) #выделяем из пути к файлу две последние директории
path=$arch$res #формируем полный путь к файлам в архивном каталоге
mkdir -p $path #создаем директории а архивном каталоге
path2=$path"/" #добавляем в конце"/"
mv -v $var $path2 &>> $log #перемещаем файлы в архивный каталог и пишем в лог вместе с ошибками
tail -1 $log #выводим на экран последнюю строчку из лог файла
done

Но перед запуском скрипта на боевом сервере, конечно хочется его протестировать. И что бы не копировать никуда кучу файлов, для пробы НА ТЕСТОВОМ можно создать пустышки следующим скриптом (НА БОЕВОМ НЕ ЗАПУСКАТЬ):

#!/bin/bash
file="/home/user/move1.txt" #входной файл
for var in $(cat $file) #цикл перебирающий строки входного файла
do
path=$(dirname $var) # выделяем полный путь
mkdir -p -v $path # создаём директорию
touch $var # создаём файл по имени взятому из списка

done

Восстановление из архива:

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

00021005
00019769
00019768
00017682
00017681
00017272
00010718

#!/bin/bash
file="/home/master/move_return.txt" #входной файл
arch="/mnt/nfs_consult/archive_media/TELEVISION" # путь к архивному каталогу
workdir="/var/www/agency.adbuy.by/upload/am/TELEVISION"
log="/home/master/mv_return.log" #log файл
for var in $(cat $file) #цикл перебирающий строки входного файла
do
cd $arch
res=$(find -name $var.*)

tmp=$(echo $res | cut -c 2-) # удаляем из строки первый символ "."
path=$arch$tmp # формируем полный путь к файлам в архивном каталоге
tmp2=/$(echo $res | cut -d / -f 2,3)/ # выделяем из пути к файлу две последние директории
path2=$workdir$tmp2 #формируем полный путь к файлам в рабочей директории
#mkdir -p $path # создаем директории
mv -v $path $path2 >> $log # перемещаем файлы из архивного каталога в рабочий и пишем в лог
tail -2 $log #выводим на экран 2 последних строки из лог файла

done

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *