символическая ссылка копирование иерархии каталогов - PullRequest
22 голосов
/ 06 августа 2009

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

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

Ответы [ 7 ]

29 голосов
/ 09 августа 2009

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

13 голосов
/ 03 сентября 2011
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/
11 голосов
/ 06 августа 2009

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

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

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

7 голосов
/ 09 сентября 2009

Есть также утилита "lndir" (из X), которая делает такую ​​вещь; Я нашел упомянутое здесь: Отчет об ошибках Debian # 301030: можем ли мы переместить lndir в coreutils или debianutils? , и теперь я с удовольствием его использую.

1 голос
/ 27 сентября 2012

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

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

  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

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

1 голос
/ 06 августа 2009

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

0 голосов
/ 10 августа 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...