Цикл при выполнении рекурсивной копии дважды посещает один и тот же «файл». Это может быть вызвано круговыми настройками ссылок. Например, если вы сделаете каталог level1
:
mkdir level1
затем символически связать файл там с этим каталогом:
cd level1
ln -s . level2
Вы в основном получаете круговую ссылку. Это означает, что вы можете сделать:
cd level2/level2/level2/...
насколько вам угодно, и никогда не покиньте каталог level1
. Это создает проблемы для рекурсивной копии, так как это будет бесконечный цикл.
Вы можете использовать cp -rH
или cp -rP
(на Solaris 10 и выше, я думаю), чтобы не следовать символическим ссылкам.
В частности, вас могут заинтересовать три флага:
-H
: Если операнд source_file является символической ссылкой, cp копирует файл, на который ссылается символическая ссылка для операнда source_file. Все остальные символические ссылки, встречающиеся при обходе файловой иерархии, сохраняются. Это означает, что если файл / каталог, указанный вами в качестве источника, является ссылкой, он скопирует цель этой ссылки. Все символические ссылки под этим источником не будут отслеживаться.
-L
: Копирует файлы, на которые ссылаются символические ссылки. Символьные ссылки, встречающиеся при обходе файловой иерархии, не сохраняются. Это будет следовать всем символическим ссылкам под источником.
-P
: копирует символические ссылки. Символьные ссылки, встречающиеся при обходе файловой иерархии, сохраняются. Я думаю, что это идентично -H
, но также сохраняет символическую ссылку для конкретного источника.