Подтвердить что ты не робот

Symlink-копирование иерархии каталогов

Какой самый простой способ для Linux "скопировать" иерархию каталогов, чтобы создать новую иерархию каталогов, а все "файлы" - это просто символические ссылки, указывающие на фактические файлы в исходной иерархии?

cp -s не работает рекурсивно.

4b9b3361

Ответ 1

Я немного искал язык и нашел команду под названием lns, доступный из здесь.

Ответ 2

Я только что сделал быстрый тест в linux box и cp -sR /orig /dest делает именно то, что вы описали: создает иерархию каталогов с символическими ссылками для не-каталогов обратно к оригиналу.

Ответ 3

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/

Ответ 4

Начиная с исходных и новых каталогов, я думаю, что эта пара команд find(1) будет делать то, что вам нужно:

find original -type d -exec mkdir new/{} \;
find original -type f -exec ln -s {} new/{} \;

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

Ответ 6

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

В папке, где должны быть указаны символические ссылки и подпапки:

  • создать файл shell.sh:

    nano shell.sh

  • скопируйте и вставьте этот charmer:

#!/bin/bash

export DESTINATION=/your/destination/folder/
export TARGET=/your/target/folder/

find . -type d -print0 | xargs -0 bash -c 'for DIR in "[email protected]"; 
do
  echo "${DESTINATION}${DIR}"
  mkdir -p "${DESTINATION}${DIR}"        
  done' -


find . -type f -print0 |  xargs -0 bash -c 'for file in "[email protected]"; 
do
  ln -s  "${TARGET}${file}"  "${DESTINATION}${file}"
   done' -
  • сохранить файл ctrl+O
  • закройте файл ctrl+X
  • Сделайте свой script исполняемый chmod 777 shell.sh

  • Запустите script ./shell.sh

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

Ответ 7

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