Как эффективно изменить цели большой коллекции символических ссылок? - PullRequest
0 голосов
/ 28 февраля 2019

Итак, у меня есть коллекция из примерно тысячи символических ссылок из одного каталога Linux в одноуровневый каталог, которые используются для реорганизации группы файлов без их копирования.

Вот моделирование моей ситуации с 3файлы:

$ ls ref reorg -l
ref:
total 0
-rw-r----- 1 me 0 28 fév 11:57 a-foo.txt
-rw-r----- 1 me 0 28 fév 11:57 b-bar.txt
-rw-r----- 1 me 0 28 fév 11:57 c-baz.txt

reorg:
total 4
lrwxrwxrwx 1 me   16 28 fév 11:58 a.txt -> ../ref/a-foo.txt
lrwxrwxrwx 1 me   16 28 fév 11:58 b.txt -> ../ref/b-bar.txt
lrwxrwxrwx 1 me   16 28 fév 11:58 c.txt -> ../ref/c-baz.txt

Теперь я понял, что должен был создать более глубокую структуру, поэтому я действительно хочу вот что:

$ ls reorg/subdir/ -l
total 0
lrwxrwxrwx 1 me 19 28 fév 12:04 a.txt -> ../../ref/a-foo.txt
lrwxrwxrwx 1 me 19 28 fév 12:04 b.txt -> ../../ref/b-bar.txt
lrwxrwxrwx 1 me 19 28 fév 12:04 c.txt -> ../../ref/c-baz.txt

Использование cp -a reorg/*.txt reorg/subdir или mv reorg/*.txt reorg/subdir дасткуча битых символических ссылок, так как в них будет отсутствовать дополнительный ../.А воссоздание символических ссылок с нуля будет большой работой из-за большого количества реорганизаций, закодированных в этих символических ссылках.

Кто-нибудь знает решение, подобное rename, но которое систематически изменяет мои тысячи целей символических ссылок?

Очевидное решение (и, вероятно, что я буду делать) - написать скрипт bash, подобный следующему:

mv reorg/*.txt reorg/subdir
for l in reorg/subdir/*.txt; do
   newtarget=`readlink $l | sed 's/^/..\//'`
   ln -sf $newtarget $l
done

, и это работает, я проверял, но я надеялся на более прямоерешение, аналогичное rename, поэтому мне не нужно писать такой скрипт каждый раз, когда я сталкиваюсь с проблемой.Я много работаю с символическими ссылками, поэтому эта проблема снова возникнет.

Это было бы моим идеальным решением, если бы оно существовало (используя переименованный синтаксис CentOS, а не Ubuntu, но любой из них был бы хорош):

mv reorg/*.txt reorg/subdir
rename-link-targets ../ ../../ reorg/subdir/*.txt

1 Ответ

0 голосов
/ 01 марта 2019

TL; DR : Нет, я не знаю такого редактора символических ссылок, как вы описали.

А теперь взломайте:

cd reorg
ln -s ../ref .

IПолучите, что вам не нужно каждый раз повторять цикл for, но ваш цикл for для редактирования тысяч ссылок также может быть циклом for для повторного создания тысяч ссылок, не так ли?

rm -rf reorg
mkdir reorg/subdir
cd reorg/subdir
for f in ../../ref/*.txt; do
   ln -s $f .
done
cd ../..

И наконец, сосредоточившись на части «каждый раз, когда я сталкиваюсь с этой проблемой», рассмотрите возможность использования абсолютного пути в вашей символической ссылке.Затем вы можете переместить reorg / subdir куда угодно, и пути все еще работают:

rm -rf reorg
mkdir reorg/subdir
cd reorg/subdir
for f in /absolute/path/to/ref/*.txt; do
   ln -s $f .
done
cd ../..

Если это все еще не приемлемо, я вернусь к хаку:

  • ваши текстовые файлы находятся в известном каталоге (ref)
  • create / path / to / sym-dir, который является символической ссылкой на этот каталог (ref)
  • create символические ссылки в reorg / subdirэта ссылка на конкретные файлы в / path / to / sym-dir

Теперь вы можете перемещать reorg / subdir куда угодно, потому что эти символические ссылки используют абсолютные пути.И вы можете перемещать ref в любом месте, где захотите, до тех пор, пока вы не удалите / path / to / sym-dir и не создадите его заново.

Конечно, fopen будет ворчать на вас за то, что вам пришлось пройтидва уровня косвенности, но это может быть цена, которую нужно заплатить.

HTH.

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