Как я могу рекурсивно скопировать каталог в другой и заменить только файлы, которые не изменились? - PullRequest
19 голосов
/ 02 марта 2009

Я хочу сделать конкретную копию в Fedora.

У меня есть две папки:

  • «webroot»: содержит ВСЕ веб-файлы / изображения и т. Д.

  • 'export': папка, содержащая тысячи документов PHP, CSS, JS, которые экспортируются из моего репозитория SVN.

Каталог экспорта содержит много тех же файлов / папок, что и корень, но в корне есть дополнительные, которые не найдены в экспорте.

Я хотел бы объединить все содержимое экспорта с моим webroot со следующими параметрами:

  1. Перезапись файла в webroot, если версия экспорта содержит код, отличный от того, что находится внутри версии webroot (live)
  2. Сохранение разрешений / пользователей / групп файла, если он перезаписан (экспорт версия, заменяющая живую версию) * ПРИМЕЧАНИЕ. Я бы хотел, чтобы права / владение webroots сохранялись, но с содержимым экспорта
  3. Нет запроса / остановки копии любого рода (т.е. не многословный)
  4. Рекурсивная копия - очевидно, я хотел бы скопировать все * файлы папки и подпапки, найденные в экспорт

Я провел небольшое исследование cp - будет ли это работать ?:

cp -pruf ./export /path/to/webroot

Ответы [ 3 ]

24 голосов
/ 02 марта 2009

Возможно, но в любой момент, когда соответствующие файлы в export и webroot имеют одинаковое содержимое, но разное время модификации, вы можете выполнить ненужную операцию копирования. Вы, вероятно, получите немного более умное поведение от rsync:

rsync -pr ./export /path/to/webroot

Кроме того, rsync может копировать файлы с одного хоста на другой через соединение SSH, если вам когда-нибудь понадобится это сделать. Кроме того, у него есть миллион опций, которые вы можете указать, чтобы настроить его поведение - подробности смотрите на странице руководства.

РЕДАКТИРОВАТЬ : в отношении вашего пояснения о том, что вы подразумеваете под сохранением разрешений: вы, вероятно, захотите отказаться от опции -p.

6 голосов
/ 02 марта 2009
  1. -u перезаписывает папку существующих файлов, если место назначения старше источника
  2. -p сохраняет разрешение и даты
  3. -f отключает многословие
  4. -r делает копию рекурсивной

Похоже, вы получили все правильные аргументы для cp

5 голосов
/ 02 марта 2009

Звучит как работа для cpio (и, следовательно, возможно, GNU tar тоже может это делать):

cd export
find . -print | cpio -pvdm /path/to/webroot

Если вам нужно сохранить владельцев, вы, конечно, должны делать это как root. Опция -p - «проходной режим», что означает копирование между локациями; -v многословно (но не интерактивно; есть разница); -d означает создание каталогов по мере необходимости; -m означает сохранить время модификации. По умолчанию, без параметра -u, cpio не будет перезаписывать файлы в целевой области, более новые, чем файлы из исходной области.

...