Итак, у меня есть коллекция из примерно тысячи символических ссылок из одного каталога 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