[quote=Kettler]А как можно ещё удалить file_list ?
[console]$ rm file_list[/console]
внутри скрипта подтверждения не будет.[/quote]
Пробывал он удаляет сам файл а мне надо файлы а точнее список который он в себе содержит
[quote=Kettler]А как можно ещё удалить file_list ?
[console]$ rm file_list[/console]
внутри скрипта подтверждения не будет.[/quote]
Пробывал он удаляет сам файл а мне надо файлы а точнее список который он в себе содержит
Пробывал он удаляет сам файл а мне надо файлы а точнее список который он в себе содержит
э...
[console]$ while read file_name; do echo "$file_name"; done <file_list[/console]
вместо echo можно вставить любую другую команду.
Спс
забыл сказать - спец-символы могут порушить скрипт.
можно сделать либо поиск по inode (составить список инодов можно так: $ ls -i | sed 's/ .*//'), а потом искать эти файлы по инодом командой
[console]$ find . -inum $INODE -exec file {} \;[/console]
а ещё можно заставить ls нормально выводить символы:
[console]$ ls --quoting-style=c[/console]
Тут написал кое что но точно кривой))) гляньте что можно подправить)
#!/bin/bash
SOURCE_BACKUP_DIR="/share/video/"
BACKUP_DIR_VIDEO="/share/backup/video/"
LOG_FILE="/var/log/backup_video.log"
SIZE_MAX="10000"
rm $SOURCE_BACKUP_DIR*.jpg
size= du -shm $BACKUP_DIR_VIDEO
date=`date "+%Y-%m-%d"`
ls -t $SOURCE_BACKUP_DIR | sed '1d;$d' | tee file_list
ls -t $BACKUP_DIR_VIDEO | sed '1d;$d' | tee file_tar
while read file_name;
do echo $SOURCE_BACKUP_DIR"$file_name" >> file_name_dir;
done < file_list;
if [ $size>=$SIZE_MAX ]
then
while read file_name;
do rm $BACKUP_DIR_VIDEO"$file_name";
done < file_tar
tar -cvvf $BACKUP_DIR_VIDEO"$date".tar -T file_name_dir
echo "`$date` Архив создан..." >> $LOG_FILE;
else
tar -cvvf $BACKUP_DIR_VIDEO"$date".tar -T file_name_dir
echo "`$date` Архив создан..." >> $LOG_FILE;
fi
rm file_list file_name_dir file_tar
rm $SOURCE_BACKUP_DIR*.jpg
картинки в сорсе убирать совсем нужно? или только что б в бекапе их не было?
size= du -shm $BACKUP_DIR_VIDEO
кавычки не нужны? сам триста лет не писал ничего, скрипт не тестировался?
Rabat эти 2 команды отрабатывают всё как надо)
rm $SOURCE_BACKUP_DIR*.jpg
вот тут кавычки не нужны. с кавычками звёздочка не раскроется. Однако, ИМХО, лучше писать всё-же так:
[console]find . -depth -name "$SOURCE_BACKUP_DIR*.jpg" -type f -exec rm -v {} \; -type d -exec rmdir {} \;[/console]
ключ depth нужен для того, что-бы find искала "наизнанку". Существует всего три способа обхода деревьев:
1) центрированный. это обход в алфавитном порядке. не используется, ибо медленно.
2) прямой - сначала посещаем корень, потом левое поддерево, потом правое, рекурсивно. Нам не подходит - когда мы посещаем корень - там что-то есть.
3) обратный - сначала обходим подкаталоги, а потом корень. именно это нам и надо - мы сначала удаляем файлы, а потом директории, в которых содержались эти файлы.
Подробнее про обход деревьев - Дональд Э. Кнут Искусство программирования. Том первый, ЕМНИП.
Вот тут подскажите как обрезать
size= du -shm $BACKUP_DIR_VIDEO
А то правило тут не работает.
if [ $size>=$SIZE_MAX ]
А то правило тут не работает.
if [ $size>=$SIZE_MAX ]
1) в bash'е только один тип данных - СТРОКИ.
когда вы используете сравнение, вы сравниваете именно СТРОКИ данных. Но, если покурить man test (а именно test тут используется, хоть и называется квадратной скобкой[[[), то станет ясно, как сравнивать целые числа (в bash они 64х битные):
Hint: используйте ПРОБЕЛЫ - гуру пишут, что это самый лучший комментарий! И ещё - старайтесь всё заключать в кавычки, если у вас нужно раскрыть переменные, используйте "двойные", иначе используйте 'одиночные'.
кстати, если вы желаете использовать лексикографическое сравнение строк в текущей локали, то вы можете воспользоваться средствами самого bash'а, а именно [[двойной квадратной скобкой]] :
Пока чего ток смог добиться рабочего smile
#!/bin/bash
SOURCE_BACKUP_DIR="/share/video/"
BACKUP_DIR_VIDEO="/share/backup/video/"
LOG_FILE="/var/log/backup_video.log"
SIZE_MAX_BACKUP="10000"
SIZE_MAX_VIDEO="1000"
rm $SOURCE_BACKUP_DIR*.jpg
size_backup=`du -shm $BACKUP_DIR_VIDEO`
size_video=`du -shm $SOURCE_BACKUP_DIR`
date=`date "+%Y-%m-%d"`
ls -t $SOURCE_BACKUP_DIR | sed '1d;$d' | tee file_list
ls -t $BACKUP_DIR_VIDEO | sed '1d;$d' | tee file_tar
size_b=${size_backup%%/*/}
size_v=${size_video%%/*/}
echo $size_b
echo $size_v
while read file_name
do echo $SOURCE_BACKUP_DIR"$file_name" >> file_name_dir
done < file_list
if [ $size_v -ge $SIZE_MAX_VIDEO ]
then
while read file_name;
do rm "$file_name";
done < file_name_dir
fi
if [ $size_b -ge $SIZE_MAX_BACKUP ]
then
while read file_name;
do rm $BACKUP_DIR_VIDEO"$file_name";
done < file_tar
tar -cvvf $BACKUP_DIR_VIDEO"$date".tar -T file_name_dir
echo "`$date` Архив создан..." >> $LOG_FILE;
else
tar -cvvf $BACKUP_DIR_VIDEO"$date".tar -T file_name_dir
echo "`$date` Архив создан..." >> $LOG_FILE;
fi
rm file_list file_name_dir file_tar
Вроде ни чё так) Спасибо DrBatty за правильное направление это мой первый опыт с bash
Осталось ток перед удалением архивов всё паковать и переносить в сеть ток после удалять всё (ну это мелочь).
По рекомендации доктора мой скрипт стал еще меньше )) Но еще не до конца доделан. Надо разобраться с шифрованием и кодами ошибок
Как то так:
#!/bin/bash
SOURCE_DATABASE="/home/parus/Data/"
BACKUP_DATABASE="/home/parus/backup/"
COPY_DIR="/home/parus/mirror/"
log_file="/var/log/parus_new_script.log"
function backup_parus()
{
tar -czf "${BACKUP_DATABASE}parus-"$date".tar.gz" $SOURCE_DATABASE || return $?
cp ${BACKUP_DATABASE}parus-"$date".tar.gz $COPY_DIR
echo "`date -d"$date" +%Y-%m-%d` Backup Parus database in $COPY_DIR successfully" >> $log_file
}
date=`date "+%Y-%m-%d"`
date_day=`date "+%w"`
[ -d $BACKUP_DATABASE ] || mkdir -pv $BACKUP_DATABASE
[ -d $COPY_DIR ] || mkdir -pv $COPY_DIR
if [[ ! `date -d"$date_day" +%w` = 6 && ! `date -d"$date_day" +%w` = 7 ]]; then
backup_parus
else
echo "`date -d"$date" +%Y-%m-%d` Резервное копирование базы Паруса не выполнено, т.к. сегодня $(date +%A)" >> $log_file
fi