Символическая ссылка копирование иерархии каталогов

Какой самый простой способ в 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? и теперь я с удовольствием его использую.

Если вам захочется испачкать руки Вот трюк, который автоматически создаст папку назначения, подпапки и рекурсивную ссылку на все файлы.

В папке, где находятся файлы, которые вы хотите символическую ссылку и подпапки:

  1. создайте файл shell.sh:

    nano shell.sh

  2. скопируйте и вставьте этот заклинатель:

#!/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' -
  1. сохранить файл ctrl+O
  2. закройте файл ctrl+X
  3. Сделайте ваш скрипт исполняемым chmod 777 shell.sh

  4. Запустите ваш скрипт ./shell.sh

Счастливого взлома!

Я знаю, что вопрос касался shell, но так как вы можете вызывать perl из shell, я написал инструмент для выполнения чего-то очень похожего на это и разместил его на perlmonks несколько лет назад. В моем случае я обычно хотел, чтобы каталоги оставались ссылками, пока я не решу иначе. Было бы довольно тривиальным изменением сделать это автоматически и рекурсивно.

Другие вопросы по тегам