Стоит Файл-сервер (Free+Samba).
4 IDE винта (20Gb,60Gb,60Gb, 160Gb)
Сетевыми ресурсами являюстя каталоги на первых трех винтах (20,60,60).
Юзеры с Виндовых пишут туда свои файлы.
4 винт - резервный
Задача раз в сутки синхронизировать содержимое расшареных каталогов с первых трех винтов на четвером (резервном)
Я пробовал делать так:
$1 - Исходный каталог
$2 - Каталог на резервном диске, куда копируется исходный1 скрипт:
(проверяет не создавались ли за день новые каталоги, если да - должен создавать их же на резервном)
#!/bin/sh
find $1 -type d -mtime 1 > $1/reserv_d.list
for a in `cat $1/reserv_d.list`; do
mkdir $2$a
echo mkdir \'$2$a\'
done2 скрипт:
(проверяет не создавались ли за день новые файлы, если да - должен копировать их на резервный)
find $1 -type f -mtime 1 > $1/reserv_f.list
for a in `cat $1/reserv_f.list`; do
cp -v \'$a\' \'$2\'
done
Скрипты по крону в 3 ночи.
Проблема в том, что пользователи создают каталоги и файлы русскими буквами и с пробелами, типа ("Песни и фильмы Васи")
поэтому mkdir и cp с такими параметрами в скрипте у меня не работаютЯ во Free недавно, вот в эту проблему уперся. Подскажите идею
Самое простое решение - не писать скрипт на фре. сделать шару доступную с одной из выневых машин и в ней по шедулеру пускать бекап с архивированием или без на шару бекапа. Там с кодировками проблем не будет.
>Самое простое решение - не писать скрипт на фре. сделать шару доступную
>с одной из выневых машин и в ней по шедулеру пускать
>бекап с архивированием или без на шару бекапа. Там с кодировками
>проблем не будет.Хотя, добавлю, меня сей момент смущает - чудесно скрипты беапят данные. Может локаль не по человечески настроенна? Или в скрипте не помешает в принудиловку указать параметры локализации, так как в профиле пользователя от которого пускается скрипт стоит LANG C и т.д.?
Локализация bash и монтирование дисков с нужной кодировской должно решить проблему.
С локализацией как раз все вроде в порядке
- основная проблема- ПРОБЕЛЫ в именах файлов и каталогов - не хочет из скрипта такие файлы копировать и каталоги создавать, хоть застрелись. то что после пробела считает параметрами. :-( . Причем та же команда из консоли выполняется на ура. може с синтаксисом в скрипте что-то не то- кавычки не те /не там? может кто подскажет (или проверит)? Фри 4.11.
А может перед копированием эти пробелы в подчеркивания перегонять?
Пробелы в подчеркивания не очень хорошая идея. Копия и оригинал должны по максимуму совпадать, потому, что раз в месяц
файлы присутствующие в копии и отсутствующие в оригинале из копии удаляются.
я думаю что проблема вfor a in `cat $1/reserv_f.list`; do
если в файле reserv_f.list строки типа
/data21/video_2/Tonya Video/Stih.mp3
то скрипту отдается сначала
/data21/video_2/Tonya
а потом
Video/Stih.mp3как такое лечить?
>я думаю что проблема в
>
>for a in `cat $1/reserv_f.list`; do
>
>если в файле reserv_f.list строки типа
>/data21/video_2/Tonya Video/Stih.mp3
>то скрипту отдается сначала
>/data21/video_2/Tonya
>а потом
>Video/Stih.mp3
Совершенно верно.>как такое лечить?
Что-то вроде:exec < "$1/reserv_f.list"
while read a; do
cat "$a"
done
>>я думаю что проблема в
>>
>>for a in `cat $1/reserv_f.list`; do
>>
>>если в файле reserv_f.list строки типа
>>/data21/video_2/Tonya Video/Stih.mp3
>>то скрипту отдается сначала
>>/data21/video_2/Tonya
>>а потом
>>Video/Stih.mp3
>Совершенно верно.
>
>>как такое лечить?
>Что-то вроде:
>
>exec < "$1/reserv_f.list"
>while read a; do
> cat "$a"
>done[test@test shell]$ cat 3.sh
#!/bin/shfile=`cat 1`
echo $file
touch "$file"
[test@test shell]$ cat 1
test test
[test@test shell]$ ./3.sh
test test
[test@test shell]$ ls -l test\ test
-rw-rw-r-- 1 test test 0 May 31 15:40 test test
[test@test shell]$
>Что-то вроде:
>
>exec < "$1/reserv_f.list"
>while read a; do
> cat "$a"
>doneвроде ближе.
по в файле $1/reserv_f.list список файлов:/data21/video_2/Tonya Video/Stih1.mp
/data21/video_2/Tonya Video/Stih2.mp
/data21/video_2/Tonya Video/Stih3.mp
/data21/video_2/Tonya Video/film1.mp
/data21/video_2/Tonya Video/еще чего-то.mpи т.п.
как быть в таком случае?
>>Что-то вроде:
>>
>>exec < "$1/reserv_f.list"
>>while read a; do
>> cat "$a"
>>done
>
>вроде ближе.
>по в файле $1/reserv_f.list список файлов:
>
>/data21/video_2/Tonya Video/Stih1.mp
>/data21/video_2/Tonya Video/Stih2.mp
>/data21/video_2/Tonya Video/Stih3.mp
>/data21/video_2/Tonya Video/film1.mp
>/data21/video_2/Tonya Video/еще чего-то.mp
>
>и т.п.
>как быть в таком случае?Попробовал бы сначала. Это как раз для списка файлов.
man sh
>>>Что-то вроде:
>>>
>>>exec < "$1/reserv_f.list"
>>>while read a; do
>>> cat "$a"
>>>done>Попробовал бы сначала. Это как раз для списка файлов.
>
>man shsorry, попробую, вчера до сервера некогда было "дойти"
Наконец то "дошел" и настроил это резервое копирование
запускается так:
sh rezerv.sh /data12 /rezerv2
/data12 - каталог, который резервируется
/rezerv2 - каталог, куда резервируются файлыСам скрипт:
#!/bin/sh
find $1 -type d -mtime 1 > $1/reserv_d.list
tr ' ' '?' < $1/reserv_d.list > $1/reserv_d2.list
cat $1/reserv_d2.list
exec > $1/reserv_d.sh
echo "#!/bin/sh"
for a in `cat $1/reserv_d2.list`; do
echo "mkdir \"""$2$a"\"
done
find $1 -type f -mtime 1 > $1/reserv_f.list
tr ' ' '?' < $1/reserv_f.list > $1/reserv_f2.list
exec > $1/reserv_f.sh
echo "#!/bin/sh"
for a in `cat $1/reserv_f2.list`; do
echo "cp -v \"""$a"\" \"$2$a\"
done
exit 0Заумно, конечно, но зато работает (и с именами с пробелами и с русскими, только символов " и ? не должно быть в именах файлов, пока и не было :-)
если кто сможет лучше - пусть напишет
Теперь вторая проблема возникла: таким же макаром удалять из копии католога файлы, удаленные из оригинала.
Жду идей. (сам, конечно, тоже копаю:-)
Забыл добавить, в конце скрипта еще
sh $1/reserv_d.sh
sh $1/reserv_d.sh