Назад | Перейти на главную страницу

Как я могу использовать rsync для дублирования дерева каталогов, создавая жесткие ссылки на файлы?

Время от времени мне приходится вносить несколько больших изменений миграции в файлы данных на моем сервере, и я ищу хороший способ сделать это. Я думал об использовании rsync для дублирования моей структуры каталогов, начиная с корневой папки данных, создавая жесткие ссылки на все исходные файлы (некоторые из них довольно большие), и я могу перезаписать в дереве назначения только те файлы, которые необходимо перенести. В конце концов, я могу смело переключаться со старых файлов на новые с помощью двух mv операции.

Однако я не могу заставить rsync сделать это. Я попытался

rsync -a --link-dest=$DATA $DATA $DATA/../upgrade_tmp

но вместо создания жестких ссылок на файлы rsync полностью их копирует. Есть ли проблема с использованием одного и того же каталога source и link-dest?

rsync - мощный инструмент, но, к сожалению, он странно разборчив в отношении некоторых путей.

Если $DATA является абсолютным путем (т.е. начинается с /), то правильная командная строка для использования:

rsync -a --link-dest=$DATA $DATA/ $DATA/../upgrade_tmp

[А теперь коротко о rsyncстранность. Обратите внимание на конечный / добавлен к исходному аргументу. Это говорит rsync работать с содержание исходного каталога, а не самого исходного каталога. (Я предполагаю, что $DATA еще не содержит завершающего /.) В данном случае мы хотим работать с содержимым, поэтому добавляем завершающий /.]

Если же, с другой стороны, $DATA относительный путь (т.е. он не начинается с /), затем комментарий Шона Р. --link-dest горит: путь link-dest интерпретируется относительно место назначения path, поэтому вы должны использовать следующее:

rsync -a --link-dest=../`basename $DATA` $DATA/ $DATA/../upgrade_tmp

РЕДАКТИРОВАТЬ

И последнее замечание, оказывается, что второй rsync командная строка, которую я дал, должна работать независимо от того, $DATA является абсолютным путем, поскольку basename неважно, является ли путь абсолютным или относительным.

Вам нужно "cp -al":

cp -al $DATA/ $DATA/../upgrade_tmp/
  • -a рекурсирует как rsync -a
  • -l будет жестко связывать файлы вместо их копирования.

Оказывается, с помощью rsync чем с другими инструментами. Правильный ответ на rsync это Стивен Монай, но самый простой способ сделать это - использовать либо cp -al или pax -rwl в системах, где -l не подходит для cp:

pax -rwl $DATA $DATA/../upgrade_tmp

или

cp -al $DATA/ $DATA/../upgrade_tmp/

В --link-dest вариант в rsync относительно место назначения каталог, а не текущий каталог. Итак, что вы хотите:

rsync -a --link-dest=../`basename $DATA` $DATA $DATA/../upgrade_tmp

Меня устраивает:

$ rsync --hard-links --recursive --link-dest=/local user@host:/remote/ /local

Я использую rsync версии 3.1.0.

Из человек:

- жесткие ссылки

Указывает rsync искать файлы с жесткой связью при передаче, без этой опции файлы с жесткой связью при передаче обрабатываются как отдельные файлы.

--link-dest = DIR

Неизмененные файлы жестко связаны из DIR в целевой каталог. Файлы должны быть идентичны по всем сохраненным атрибутам (например, разрешениям, возможно, владению), чтобы файлы могли быть связаны друг с другом.

Можете попробовать по ссылке http://www.lessfs.com/wordpress/ это работа над Корова (копировать при записи), что сэкономит время и место

Сначала создайте каталоги только в месте назначения:

rsync -av --include '*/' --exclude '*' /source/ /destination/

Затем жестко свяжите только файлы:

cd /source
find . -type f -exec ln -v {} /destination/{} \;

Используйте параметр -H, чтобы сохранить жесткие ссылки и прочитать справочную страницу.