4

Я пытаюсь написать сценарий развертывания сайта, который будет копировать файлы следующим образом:

ИСТОЧНИК

.
..
src/
html/

DEST

.
..
src/
html/ -> /var/www/ftproot/mysite

Я хочу, чтобы файлы в SOURCE html шли в DEST /var/www/ftproot/mysite .

Сценарий был:

cd SOURCE
cp -Rf * DEST

Каждый раз, когда я запускаю скрипт, я получаю эту ошибку:

cp: cannot overwrite non-directory 'html' with directory `html'

Из этого я делаю вывод, что cp не может автоматически копировать файлы в DEST, когда DEST имеет символические ссылки.

Заметки:

  1. Следуя руководству по cp, я установил POSIXLY_CORRECT в 1. Это не работает

  2. Мне пришлось связать сайт html с ftproot/mysite а не наоборот, потому что у пользователей ftp странные режимы доступа.

  3. Этот парень изменил исходный код cp и перекомпилировал его. Я не хочу делать это с производственным сервером.

Есть идеи, как это решить?

2 ответа2

5

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

cd SOURCE
rsync -K -a . DEST

Опция -K делает именно то, что вы хотите:-K, --keep-dirlinks обрабатывают символьный каталог на приемнике как каталог

2

Поскольку cp не будет копировать ни один каталог в SOURCE по любой символической ссылке в DEST, одним из вариантов является копирование этих каталогов отдельно для каждой символической ссылки.

Подход с использованием поиска

cd DEST
cp -Rf SOURCE/* .
find -type l -exec bash -c 'cp -Rf "SOURCE/$0"/* "$0"' {} \;

подробности

  • -type l ограничивает поиск символическими ссылками.
  • -exec bash -c '...' {} \; выполняет ... в подоболочке bash для каждой найденной символической ссылки, передавая {} (относительный путь к символической ссылке) в качестве наиболее подходящего аргумента ($0).
  • cp -Rf "SOURCE/$0"/* "$0" копирует содержимое соответствующего исходного каталога в каталог, на который указывает символическая ссылка.
  • Команда cp должна вызываться с использованием bash, поэтому глобус (звездочка) будет расширен.

Предостережения

  • Я предлагаю заменить cp на echo (или -Rf на -Ri), чтобы найти то, что вы ожидаете.
  • Не зная точной структуры каталогов и символических ссылок, присутствующих в DEST, я не могу гарантировать, что предвидел все возможные странности.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .