Сценарий оболочки Linux: резервное копирование и восстановление файлов с сохранением местоположения в каталоге

#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 могут отличаться, и вам может потребоваться помощь в настройке нового репозитория для вашего проекта.