Как я могу рекурсивно скопировать каталог в другой и заменить только файлы, которые не изменились?
Я хочу сделать конкретную копию в Fedora.
У меня есть две папки:
-
'webroot': сохранение ВСЕХ веб файлов/изображений и т.д.
-
'export': папка, содержащая тысячи PHP, CSS, JS-документов, которые экспортируются из моего SVN-репо.
В каталоге экспорта содержатся многие из тех же файлов/папок, что и корневой каталог, однако корень содержит дополнительные, которые не найдены в экспорте.
Я хотел бы объединить все содержимое экспорта с моим веб-сайтом со следующими параметрами:
- Перезапись файла в webroot, если версия экспорта содержит другой код, чем
находится внутри веб-версии (в прямом эфире)
- Сохранять разрешения/пользователи/группы файла, если они перезаписаны (экспорт
версия, заменяющая живую версию) * ПРИМЕЧАНИЕ. Я бы хотел, чтобы разрешения/права на веб-корни поддерживались, но с содержимым экспорта.
- Не запрашивать/останавливать копию
любого рода (то есть не многословный)
- Рекурсивная копия - очевидно, я
хотел бы скопировать все * файлы
папок и подпапок, найденных в
экспорт
Я провел немного исследований в cp - будет ли это делать работу?:
cp -pruf ./export /path/to/webroot
Ответы
Ответ 1
Возможно, но в любой момент, когда соответствующие файлы в export
и webroot
имеют один и тот же контент, но разные времена модификации, вы завершаете выполнение ненужной операции копирования. Вероятно, вы получите немного более умное поведение от rsync
:
rsync -pr ./export /path/to/webroot
Кроме того, rsync
может копировать файлы с одного хоста на другой по SSH-соединению, если вам когда-либо понадобится это сделать. Кроме того, у него есть параметры zillion, которые вы можете указать, чтобы настроить его поведение. Подробности см. на странице руководства.
EDIT: в отношении вашего разъяснения о том, что вы имеете в виду, сохраняя разрешения: вы, вероятно, захотите оставить параметр -p
.
Ответ 2
- -u перезаписывает папку существующих файлов, если место назначения старше источника
- -p сохраняет разрешения и даты
- -f отключает многословие
- -r делает копию рекурсивной
Похоже, вы получили все правильные аргументы для cp
Ответ 3
Звучит как задание для cpio
(и, следовательно, возможно, GNU tar тоже может это сделать):
cd export
find . -print | cpio -pvdm /path/to/webroot
Если вам нужны владельцы, вы должны сделать это как root, конечно. Опция -p
- это "режим передачи", что означает копирование между местоположениями; -v
является подробным (но не интерактивным, есть разница); -d
означает создание каталогов по мере необходимости; -m
означает сохранение времени модификации. По умолчанию без параметра -u
cpio
не будет перезаписывать файлы в целевой области, которые новее, чем та, которая находится в исходной области.