Какой самый простой способ для Linux "скопировать" иерархию каталогов, чтобы создать новую иерархию каталогов, а все "файлы" - это просто символические ссылки, указывающие на фактические файлы в исходной иерархии?
cp -s
не работает рекурсивно.
Какой самый простой способ для Linux "скопировать" иерархию каталогов, чтобы создать новую иерархию каталогов, а все "файлы" - это просто символические ссылки, указывающие на фактические файлы в исходной иерархии?
cp -s
не работает рекурсивно.
Я немного искал язык и нашел команду под названием lns
, доступный из здесь.
Я только что сделал быстрый тест в linux box и 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 "[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
Счастливый взлом!
Я знаю, что вопрос касался оболочки, но поскольку вы можете вызвать perl из shell, я написал инструмент, чтобы сделать что-то очень похожее на это, и опубликовано он на perlmonks несколько лет назад. В моем случае я вообще хотел, чтобы каталоги оставались ссылками до тех пор, пока я не решила иначе. Было бы довольно тривиальное изменение сделать это автоматически и рекурсивно.