У меня есть папка SOURCE, которая содержит несколько папок подуровня, каждая со своими файлами.
Я хочу скопировать эту папку в новую папку COPY, где мне нужно скопировать структуру каталогов, но сохранить файлы как символические ссылки на исходные файлы в SOURCE и его подпапках.
Ответы:
Вот решение для не встроенных Linux и Cygwin:
Обратите внимание, что SOURCE должен быть абсолютным путем и иметь косую черту. Если вы хотите указать относительный путь, вы можете использовать
источник
SOURCE
это относительный путь, то я так думаю. Попробуйте, и если это не сработает, я предлагаю вам задать новый вопрос. Ссылка на это непременно.Существует как минимум 2 стандартные утилиты для построения теневого дерева каталогов существующего дерева, поэтому здесь не нужно писать код.
Сначала есть
lndir(1)
изxutils-dev
пакета. Он использует символические ссылки на файлы. Со страницы руководства:Возможно, лучшая альтернатива состоит в том, чтобы просто использовать
cp
правильные варианты, как предполагает принятый ответ. Я просто приведу еще несколько, надеюсь, полезных деталей:Если вас не интересует сохранение всех атрибутов (владельцев / разрешений, времени), замените
a
параметр (эквивалентный-dr --preserve=all
) наr
(только рекурсивный):источник
lndir
здесь также доступен сценарий оболочки, если он не установлен: opensource.apple.com/source/X11/X11-0.46.4/lndir.sh?txtВы можете попробовать пару команд поиска как это:
источник
Нечто подобное сделает то, что вам нужно.
Каталоги создаются в целевом дереве COPY. Все остальное символически связано с абсолютным путем в дереве ИСТОЧНИКОВ. Убедитесь, что SOURCE и COPY указаны как абсолютные пути (начиная с
/
).Если у вас есть большое дерево для копирования, и вам нужен отчет о проделанной работе для каждого каталога, вы можете добавить его
echo "$ITEM" >&2;
непосредственно передmkdir
командой.(Я посмотрел на
cp
и ,cpio
но ни один не кажется, есть возможность для подключения к источнику с символическими ссылками.)источник
{ mkdir -p "$COPY/$ITEM"; continue; }
ksh
сценарий ... но похоже, что этоbash
тоже необходимо . ФиксацияЕсли в SOURCE нет пустых папок, которые нужно скопировать
источник
cp
любом случае вы принимаете GNU , почему бы и нетcp -as
?Я бы начал с разрыва Perl:
File::Find
это полезный модуль, который позволяет запускать определенную подпрограмму для любого файла в дереве каталогов. В этом случае подпрограмма проверяет, является ли она каталогом - и если это так, делаетmkdir
или файл - в этом случае она делает символическую ссылку.источник
Кажется, вы ищете что-то вроде инструмента
rsnapshot
; он создает копии произвольных каталогов и использует жесткие ссылки, где это возможно. (Посмотрите справочную страницу, чтобы понять, подходит ли она.)источник