#linux #bash #shell #scripting #backup
#linux #bash #оболочка #создание сценариев #резервное копирование
Вопрос:
Я хочу написать скрипт оболочки Linux, чтобы выполнить резервное копирование и восстановление всего исходного кода в папке моего проекта (.c, .cpp, .java и т.д.)
Мой скрипт удаляет все эти файлы исходного кода, и я хочу иметь возможность легко восстановить файлы, если потребуется.
Вот что я сейчас делаю:
#copy the entire directory to a backup folder
cp -r $CLEANUP_PATH $BACKUP_PATH
#delete the project and copy from backup to restore source code
rm -rf $CLEANUP_PATH
cp -r $BACKUP_PATH $CLEANUP_PATH
Объем проекта составляет около 600 МБ, поэтому выполнение этих действий занимает много времени.
Как я смогу восстановить только исходный код (а не весь каталог) из резервной копии и гарантировать, что каждый файл будет восстановлен в определенные каталоги, к которым принадлежит каждый файл?
Комментарии:
1. Почему бы вам просто не использовать систему управления версиями?
2.
cp -r
Копируются ли точечные файлы? т.Е. .exrc и т.д.?3. @Carl — Целью здесь является удаление исходного кода для защиты интеллектуальной собственности. Функциональность резервного копирования / восстановления в основном предназначена для целей внутреннего тестирования. Поправьте меня, если я ошибаюсь, но я считаю, что использование системы управления версиями было бы значительно более медленным подходом для этого.
4. @shellter — Одна из вещей, которые я пробовал, была: найдите $CLEANUP_PATH -iname «*.c» -exec cp {} {}.bkup ; Однако при этом не сохраняется каталог, из которого были получены файлы, когда я перехожу к восстановлению из резервной копии. cp -r рекурсивно копирует каталог, включая каждый отдельный файл в корневом каталоге и все подкаталоги.
5. Почему вы копируете, а затем удаляете? Если назначение и источник находятся на одном физическом устройстве, использование mv будет намного быстрее.
Ответ №1:
Рассмотрите возможность использования tar
: он запоминает все о файлах, включая пути, разрешения и даты. Если ваш исходный код находится в нескольких каталогах, вы можете извлечь эти директории по имени из файла tar.
Комментарии:
1. Как будет выглядеть синтаксис, если я захочу найти и создать резервные копии всех файлов .c, например, из /home / username /PROJECT_FOLDER?
2.
tar zcvf /tmp/mybackup.tar.gz /home/username/PROJECT_FOLDER/*.c
3. Спасибо, но в итоге это оказался тот синтаксис, который мне был нужен:
tar -zcvf ${BACKUP_PATH}/c_backup.tar find ${CLEANUP_PATH} -name "*.c"
Как мне извлечь эти файлы, чтобы восстановить их в каталоги, из которых они пришли, без перезаписи других существующих файлов в этих каталогах?4. Неважно, я понял это.
tar -xzvf c_backup.tar -C ${CLEANUP_PATH}
Ответ №2:
Рассмотрите возможность использования контроля версий. Он запоминает все о файлах, включая пути, разрешения, даты и предыдущие ревизии. Это не только предотвратит аварийное восстановление, но и сделает вас лучшим разработчиком (по ряду причин).
git init .
git add `find . -type f | egrep '.(cpp|c|java)$'`
git commit -m "initial version"
Конечно, предполагается, что у вас есть данные в каталоге, которые вы не хотите фиксировать / сохранять. Если вы хотите сохранить все (пожалуйста, никаких двоичных файлов / библиотек / других сгенерированных или генерируемых файлов!), то вы можете git add .
После выполнения некоторой работы проверьте изменения
git status
git commit -a -m "Descriptive comment about changes"
Вы также можете создавать клоны репозитория git на случай, если вы удалите каталог. Клонирование вне системы в случае удаления компьютера.
git clone ssh://hostname/path/to/repository
Комментарии:
1. Мы используем TortoiseSVN, где я работаю. Я не уверен, обладает ли он теми же возможностями, что и git, о которых вы упомянули, но я изучу это. Спасибо.
2. Хотя я продвигаю git поверх svn, любой из них настолько продвинут, что «tar» и «cp» неотличимы. Команды subversion могут отличаться, и вам может потребоваться помощь в настройке нового репозитория для вашего проекта.