4

В моей ситуации есть 2 каталога: /blah /d01 и /blah /d02

$ls -l /blah/d01
a/
b/
c/
fa -> a
fb -> b
fc -> c

и я хочу скопировать fa, fb, fc в /blah /d02, и в результате:

$ls -l /blah/d02
fa -> ../d01/a
fb -> ../d01/b
fc -> ../d01/c

Дело в том, что я хочу сделать что-то вроде cp - {некоторый магический атрибут} /blah /d01 /f * /blah /d02 /, чтобы это произошло.

Спасибо

ОБНОВИТЬ

Я остановился на bash-скрипте:

#! /bin/bash
for i in $@; do echo $i && [ -L $i ] && ln -s $(dirname $i)/$(readlink $i) $(basename $i); done

которые создают новые ссылки на основе старых (убедитесь, что они используют относительный путь)

ОБНОВЛЕНИЕ СНОВА

Я обнаружил, что мой последний скрипт работает, но путь ссылки будет неуклюже длинным (заполненным странными относительными путями) после копирования символических ссылок из a в b и из b в c, поэтому я добавил что-то для очистки относительного пути, и сценарий заканчивается:

#! /bin/bash
function relpath {
  source=$1
  target=$2

  common_part=$source
  back=
  while [ "${target#$common_part}" = "${target}" ]; do
    common_part=$(dirname $common_part)
    back="../${back}"
  done

  echo ${back}${target#$common_part/}
}

for i in $@; do echo $i && [ -L $i ] && ln -s $(relpath $PWD $(readlink -f $i)); done

2 ответа2

2

Поскольку эти символические ссылки создаются без полного пути, это сложно сделать с помощью cp . Но вы могли бы скорее создать новые на цели:

for i in *; do [ -L $i ] && cd blah && ln -s ../$i $i && cd -; done

Краткое объяснение:

  • for i in *: цикл по списку файлов / каталогов в текущем местоположении
  • do: инкапсулировать то, что должно быть сделано
  • [ -L $i ] &&: продолжить, только если текущая запись является символической ссылкой
  • cd blah && ln -s ../$i $i && cd -: перейти на blah и создать символические ссылки на исходное местоположение

Это еще не совсем то, что вы хотите (так как это символические ссылки). Поэтому мы немного его изменим:

for i in *; do [ -L $i ] && cd blah && ln -s ../$(readlink ../$i) $i && cd -; done

Добавленная конструкция $(readlink ../$i) оценивает объект, на который указывает ссылка, и вместо этого помещает результат туда. Et вуаля - результат - то, что вы искали.

Обратите внимание, что я немного упростил ваш запрос (сделав его так, как если бы вы просто хотели скопировать символические ссылки в подкаталог), чтобы легче было следовать. Вы также должны настроить его, так как я не предполагаю, что ваш настоящий каталог называется blah :)

0

Я думаю, что вы должны использовать полный путь вместо относительного пути как

fx -> /full/path/to/x

Поэтому, когда вы копируете ссылку, она всегда будет показывать x.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .