Символическая ссылка копирование иерархии каталогов
Какой самый простой способ в Linux "скопировать" иерархию каталогов, чтобы создать новую иерархию каталогов, а все "файлы" - это просто символические ссылки, указывающие на фактические файлы в исходной иерархии?
cp -s
не работает рекурсивно.
7 ответов
Я немного погуглил и нашел команду под названием lns
, доступно здесь.
Я только что сделал быстрый тест на коробке Linux и cp -sR /orig /dest
делает именно то, что вы описали: создает иерархию каталогов с символическими ссылками для не-каталогов обратно к оригиналу.
cp -as /root/absolute/path/name dest_dir
будет делать то, что вы хотите. Обратите внимание, что имя источника должно быть абсолютным путем, оно не может быть относительным. Иначе, вы получите эту ошибку: "xyz-file: может создавать относительные символические ссылки только в текущем каталоге".
Кроме того, будьте осторожны с тем, что вы копируете: если dest_dir уже существует, вам придется сделать что-то вроде:
cp -as /root/absolute/path/name/* dest_dir/
cp -as /root/absolute/path/name/.* dest_dir/
Начиная сверху оригинальных и новых каталогов, я думаю, что эта пара find(1)
Команды сделают то, что вам нужно:
find original -type d -exec mkdir new/{} \;
find original -type f -exec ln -s {} new/{} \;
Первый экземпляр устанавливает структуру каталогов, находя только каталоги в исходном дереве и воссоздавая их в новом дереве. Второй создает символические ссылки на оригинальные файлы в новом дереве.
Есть также утилита "lndir" (из X), которая делает такую вещь; Я нашел упомянутое здесь: Отчет об ошибке Debian #301030: можем ли мы переместить lndir в coreutils или debianutils? и теперь я с удовольствием его использую.
Если вам захочется испачкать руки Вот трюк, который автоматически создаст папку назначения, подпапки и рекурсивную ссылку на все файлы.
В папке, где находятся файлы, которые вы хотите символическую ссылку и подпапки:
создайте файл shell.sh:
nano shell.sh
- скопируйте и вставьте этот заклинатель:
#!/bin/bash
export DESTINATION=/your/destination/folder/
export TARGET=/your/target/folder/
find . -type d -print0 | xargs -0 bash -c 'for DIR in "$@";
do
echo "${DESTINATION}${DIR}"
mkdir -p "${DESTINATION}${DIR}"
done' -
find . -type f -print0 | xargs -0 bash -c 'for file in "$@";
do
ln -s "${TARGET}${file}" "${DESTINATION}${file}"
done' -
- сохранить файл
ctrl+O
- закройте файл
ctrl+X
Сделайте ваш скрипт исполняемым
chmod 777 shell.sh
Запустите ваш скрипт
./shell.sh
Счастливого взлома!
Я знаю, что вопрос касался shell, но так как вы можете вызывать perl из shell, я написал инструмент для выполнения чего-то очень похожего на это и разместил его на perlmonks несколько лет назад. В моем случае я обычно хотел, чтобы каталоги оставались ссылками, пока я не решу иначе. Было бы довольно тривиальным изменением сделать это автоматически и рекурсивно.