Я уже скопировал терабайты файлов, rsync
но забыл использовать их --archive
для сохранения специальных атрибутов файлов.
Я попытался выполнить rsync
снова на этот раз, --archive
но это было намного медленнее, чем я ожидал. Есть ли простой способ сделать это быстрее, просто рекурсивно копируя метаданные?
filesystem
rsync
metadata
Мохаммад
источник
источник
Ответы:
Хорошо, вы можете скопировать владельца, группу, разрешение и временные метки с помощью
--reference
параметра кchown
,chmod
,touch
. Вот скрипт для этогоВы должны запустить его с
sudo
(чтобы разрешить chown) и с двумя параметрами: исходный каталог и каталог назначения. Сценарий только повторяет, что он будет делать. Если выполнено, измените строкуmyecho=echo
наmyecho=
.источник
touch --reference=otherfile file
. Обновленный ответtouch
по дизайну изменяется только время модификации и доступа, на время «создания» это не влияет. (Я думаю, что ext2 / 3 в любом случае не поддерживает изменение ctime, но это может иметь значение, если вы используете NTFS или тому подобное).-c
переключатель вtouch
команду, чтобы она не создавала пустые файлы в$dst_path
.ВНИМАНИЕ: Без специальных обходных путей GNU
cp --attributes-only
будет обрезать конечные файлы, по крайней мере, в Precise. Смотрите редактирование ниже.Оригинал:
В этой ситуации вы, вероятно, захотите, чтобы
--attributes-only
опция GNU cp , вместе с--archive
проверенным и протестированным кодом, выполняла все атрибуты, независимые от файловой системы, и не следовала по символическим ссылкам (следовать им может быть плохо!):Как и в случае с файлами,
cp
он дополняет расширенные атрибуты: если у источника и получателя есть расширенные атрибуты, он добавляет расширенные атрибуты источника к месту назначения (вместо того, чтобы сначала удалить все xattrs назначения). Хотя это отражаетcp
поведение при копировании файлов в существующее дерево, это может быть не так, как вы ожидаете.Также обратите внимание, что если вы не сохранили жесткие ссылки в первый раз,
rsync
но хотите сохранить их сейчас, тоcp
это не исправит для вас; вам, вероятно, лучше всего выбратьrsync
правильные варианты (см. мой другой ответ ) и быть терпеливым.Если вы нашли этот вопрос, пытаясь преднамеренно разделить и рекомбинировать содержимое метаданных / файлов, вы можете взглянуть на metastore, который находится в репозиториях Ubuntu.
Источник: руководство по GNU coreutils
Отредактировано, чтобы добавить:
cp
из GNUcoreutils
> = 8.17 и выше будет работать как описано, но coreutils <= 8.16 будет урезать файлы при восстановлении их метаданных. Если есть сомнения, не используйтеcp
в этой ситуации; используйтеrsync
с правильными вариантами и / или будьте терпеливы.Я бы не рекомендовал это, если вы не полностью понимаете, что делаете, но ранее GNU
cp
можно было не обрезать файлы, используя трюк LD_PRELOAD :источник
errorno
должно бытьerrno
, верно?rsync
с правильными вариантами, является ответом на другой вопрос ...Отвечая на вопрос как «rsync только копирует метаданные, так почему же он такой медленный и как я могу сделать это быстрее?»:
rsync
обычно использует одинаковые значения mtimes в качестве эвристики для обнаружения и пропуска неизмененных файлов. Без--archive
(в частности, без--times
) значения mtimes целевых файлов остаются равными времени, в течение которого они были синхронизированы, в то время как значения mtimes исходных файлов остаются нетронутыми (не обращая внимания на ручной обман). Без внешних гарантий от вас, что содержимое исходных файлов не изменилось, rsync должен предположить, что они могут иметься, и поэтому должен проверять их и / или снова копировать в место назначения. Это, а также тот факт , что--whole-file
подразумевается димость> местных синхронизаций, делаетrsync
без--times
приблизительно эквивалентныcp
местных синхронизаций.При условии, что обновление содержимого целевых файлов является приемлемым, или если исходные файлы не затронуты с момента оригинальной копии, вы должны найти
rsync --archive --size-only
быстрее, чем наивный rsync.Если вы сомневаетесь в том, что
rsync
копирование занимает так много времени,rsync --archive --dry-run --itemize-changes ...
вам сообщат исчерпывающую, если кратко, подробность.источник
В локальных передачах, когда источник и место назначения находятся в локально смонтированных файловых системах,
rsync
всегда будет копировать весь файл. Чтобы избежать этого вы можете использоватьисточник
rsync
запретить использование ярлыка, когда файлы находятся по локальному пути, но это не препятствуетrsync
копированию содержимого.Мне пришлось сделать это удаленно на другой компьютер, чтобы я не мог использовать --reference
Я использовал это, чтобы сделать сценарий ...
find -printf "touch -d \"%Tc\" \"%P\"\n" >/tmp/touch.sh
Но сначала убедитесь, что в них нет имен файлов с "...
find | grep '"'
Затем скопируйте файл touch.sh на удаленный компьютер и запустите ...
cd <DestinationFolder>; sh /tmp/touch.sh
В find -printf также есть опции для печати пользователя, имени группы, если вы хотите скопировать их.
источник
find
. Я был в такой же ситуации - забыл скопировать атрибуты, диски источника и назначения уже были в разных машинах и не были на самом деле хотят отменить это.