Примечание: я новичок в работе с Linux, но я кратко исследовал команду rsync и я почти уверен, что это то, что я буду использовать.К сожалению, у этих команд есть много разных опций, и я немного запутался, как использовать их в моей конкретной ситуации (обрисовано в общих чертах ниже).

Ситуация: у меня есть два каталога, один с базовым набором файлов, которые были загружены из репозитория (я не хочу их изменять), а другой - с рабочей копией того же репо. Что я ищу, так это команда, которая сравнивает мою рабочую копию репо со статическим репо, чтобы увидеть, есть ли какие-либо изменения между ними. Если есть изменение, только измененные файлы будут перемещены в другой каталог (специально для резервных копий). Другое ограничение заключается в том, что я хочу сохранить структуру каталогов рабочей копии (см. Пример ниже).

Пример:

Статическое Репо:

/src
    code1.java
    code2.java
/tests
    test1.java

Рабочая Репо:

/src
    code1.java
    code2.java (modified)
/tests
    test1.java
    test2.java (added)

Каталог резервных копий:

/src
    code2.java
/tests
    test2.java

Первоначально статический репо и рабочий репо были бы одинаковыми, а каталог резервных копий был бы пустым. Как только я внесу изменения в Рабочее Репо, я смогу выполнить команду, которую ищу, и Каталог резервных копий будет заполнен соответствующим образом (только с новыми / измененными файлами / каталогами).

Существует ли такая команда?

2 ответа2

2

Я не уверен, какую проблему вы пытаетесь решить, но я верю, что git вероятно, мог бы решить ее. Но давайте предположим, что единственным приемлемым вариантом является какой-то скрипт резервного копирования.

Я бы использовал команду find для поиска всех файлов в working_repo, более новых, чем файл в static_repo, с последним временем изменения.

Поэтому я бы начал с поиска последнего файла в статическом репозитории, а затем использовал бы что-то вроде:

find <working_repo> -type f -newer <latest_file_in_static_repo> -exec rsync {} <backup_dir>/{} \;

варианты find:

  • -newer <f> Найти файлы, которые были изменены более недавно, чем файл <f> .
  • -exec <command> выполнить <command> для каждого найденного файла, где {} заменяется на имя обрабатываемого файла.
  • -type f Найти только F ИЛЬ (показывать каталоги, символические ссылки, розетки и т.д.).

Примечание: я не проверял команду выше, поэтому она может содержать некоторые ошибки или опечатки, но в целом это показывает идею.

0

Вменяемая резервная копия хранит историю. И чтобы иметь возможность читать это в любой системе, я бы стремился к чему-то вроде:

20170125-230000
  /src
      code1.java (version 1)
      code2.java (version 1)
  /tests
      test1.java (version 1)

20170126-000000
  /src
      code1.java (version 1) hardlink to 20170125-230000
      code2.java (version 2)
  /tests
      test1.java (version 1) hardlink to 20170125-230000 
      test2.java (version 1)

20170126-010000
  /src
      code1.java (version 1) hardlink to 20170125-230000
      code2.java (version 2) hardlink to 20170126-000000
      code3.java (version 1)
  /tests
      test1.java (version 2)
      test3.java (version 1)

Чтобы сохранить дисковое пространство, rsync может использовать --link-dest для создания жестких ссылок для файлов (или, возможно, даже папок), которые не изменились. Конечно, это также подразумевает, что если какой-то сектор на диске резервного копирования выйдет из строя , вся история какого-либо неизмененного файла может быть потеряна (скажем, code1.java (version 1) выше, которая фактически сохраняется на диске только один раз, пока все резервные копии). Итак: всегда вращайте резервные диски.

Видите машину времени на Ubuntu? для реализации, и прочитать предупреждения о понимании жестко связанных папок. Но вы, вероятно, хотите использовать что-то вроде rsnapshot.

(И действительно, ответом на вашу настоящую проблему является Git. Но даже тогда вам нужно делать резервные копии. Всегда создавайте резервные копии. Всегда.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .