Прилетела тут задачка переместить по списку 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#!/bin/bash file="/home/master/move_return.txt" #входной файл arch="/mnt/nfs_2/archive_media/archive" # путь к архивному каталогу workdir="/var/www/directory_1/directory_2/directory_3/directory_4" 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 |