Назад | Перейти на главную страницу

Поддержка сценариев оболочки BASH, сценарий резервного копирования извлекает метаданные из имени файла и перемещает файл соответствующим образом

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

На десятке машин у меня есть каталог (назовем его / Prod / Data /), полный файлов с тысячами файлов с именами data-HOST-v.7.mmddyy.csv

пример: date-web2-v.7.052509.csv

Файлы старше 5 минут необходимо вытащить с удаленных машин в локальную папку / резервную копию / архив / хост / год / месяц / день / csvs

пример / резервное копирование / архив / web2 / 2009/05/29 / csvs

Я уверен, что смогу сделать что-нибудь вроде ls -1 | вырезать -d "." -f3, чтобы извлечь раздел даты файла, затем использовать sed или awk, чтобы изолировать каждый раздел и создать переменные даты, чтобы выбрать, в какие каталоги выгрузить файлы, сделайте что-то подобное, чтобы захватить хост, но я не уверен, как сделать так, чтобы это соответствовало файлу, для которого нужно выполнить переход. Не уверен, как выполнить это удаленно, возможно, лучше сначала скопировать все файлы с удаленного компьютера (за исключением любого файла младше 5 минут, возможно, можно использовать оператор find -mmin +5, чтобы выяснить это?) затем выполните сортировку, когда все будет на резервной машине.

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

Спасибо за уделенное время.

Решение Pure Bash с использованием расширения параметров. Видеть этот для объяснения PE.

foo='date-web2-v.7.052509.csv'
file=${foo%*.csv}
date=${file##*.}

month=${date:0:2}
day=${date:2:2}
year=${date:4:2}

Я бы, вероятно, использовал для этого Perl и использовал скобки, чтобы фиксировать то, что я хочу в группах, из регулярного выражения.

На будущее, это сценарий, который я придумал:

#!/bin/bash
if [ $# != 1 ]
   then
      echo "usage:  slurp_vote_files.sh [user@server]"
      exit 1
fi
ssh $1 "find /Prod/Data/Votes/ -mmin +5 -type f" | while read line; do 
   vote_host=`echo $line | cut -d"_" -f3`
   vote_year=`echo $line | cut -d"." -f3 | sed 's/^..../20/'`
   vote_month=`echo $line | cut -d"." -f3 | sed 's/.\{4\}$//'`
   mkdir -p /bkup/archive/finalized/$vote_host/$vote_year/$vote_month/votes/
   scp -q $1:$line /bkup/archive/finalized/$vote_host/$vote_year/$vote_month/votes/
   ssh -n $1 "rm -f $line";
done
exit 0

Это может не совпадать с целями / спецификациями в исходном посте, но в моем конкретном случае это работает.

В найти Команда имеет возможность выбирать файлы в зависимости от их возраста. См. Параметры -amin, -atime, -cmin, -ctime, -mmin и -mtime.

Вы можете использовать find для создания списка файлов, которые вам нужно переместить, сохранить его в файле, а затем использовать его в команде rsync с параметрами --include-from = и --remove-source-files.