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