Время от времени мне приходится вносить несколько больших изменений миграции в файлы данных на моем сервере, и я ищу хороший способ сделать это. Я думал об использовании 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/
rsync -a
Оказывается, с помощью 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, чтобы сохранить жесткие ссылки и прочитать справочную страницу.