Как я могу «перемотать» много сломанных символических ссылок?

У меня есть дерево каталогов, у которого есть куча символических ссылок на файлы под /home … однако я переехал /home в /mnt/home и вам нужен способ «переместить» все символические ссылки. Существует ли такая функциональность или мне нужно написать сценарий для этого?

В качестве примера у меня есть что-то вроде следующего:

 [root@trees ~]# ls -l /mnt/home/someone/something total 4264 lrwxrwxrwx 1 jnet www-data 55 2011-08-07 13:50 a -> /home/someone/someotherthing/a lrwxrwxrwx 1 jnet www-data 55 2011-08-07 13:50 b -> /home/someone/someotherthing/b lrwxrwxrwx 1 jnet www-data 55 2011-08-07 13:50 c -> /home/someone/someotherthing/c lrwxrwxrwx 1 jnet www-data 55 2011-08-07 13:50 d -> /home/someone/someotherthing/d lrwxrwxrwx 1 jnet www-data 55 2011-08-07 13:50 e -> /home/someone/someotherthing/e /mnt/home/someone/something/subdir: total 4264 lrwxrwxrwx 1 jnet www-data 55 2011-08-07 13:50 a -> /home/someone/someotherthing/subdir/a lrwxrwxrwx 1 jnet www-data 55 2011-08-07 13:50 b -> /home/someone/someotherthing/subdir/b lrwxrwxrwx 1 jnet www-data 55 2011-08-07 13:50 c -> /home/someone/someotherthing/subdir/c lrwxrwxrwx 1 jnet www-data 55 2011-08-07 13:50 d -> /home/someone/someotherthing/subdir/d lrwxrwxrwx 1 jnet www-data 55 2011-08-07 13:50 e -> /home/someone/someotherthing/subdir/e - [root@trees ~]# ls -l /mnt/home/someone/something total 4264 lrwxrwxrwx 1 jnet www-data 55 2011-08-07 13:50 a -> /home/someone/someotherthing/a lrwxrwxrwx 1 jnet www-data 55 2011-08-07 13:50 b -> /home/someone/someotherthing/b lrwxrwxrwx 1 jnet www-data 55 2011-08-07 13:50 c -> /home/someone/someotherthing/c lrwxrwxrwx 1 jnet www-data 55 2011-08-07 13:50 d -> /home/someone/someotherthing/d lrwxrwxrwx 1 jnet www-data 55 2011-08-07 13:50 e -> /home/someone/someotherthing/e /mnt/home/someone/something/subdir: total 4264 lrwxrwxrwx 1 jnet www-data 55 2011-08-07 13:50 a -> /home/someone/someotherthing/subdir/a lrwxrwxrwx 1 jnet www-data 55 2011-08-07 13:50 b -> /home/someone/someotherthing/subdir/b lrwxrwxrwx 1 jnet www-data 55 2011-08-07 13:50 c -> /home/someone/someotherthing/subdir/c lrwxrwxrwx 1 jnet www-data 55 2011-08-07 13:50 d -> /home/someone/someotherthing/subdir/d lrwxrwxrwx 1 jnet www-data 55 2011-08-07 13:50 e -> /home/someone/someotherthing/subdir/e - [root@trees ~]# ls -l /mnt/home/someone/something total 4264 lrwxrwxrwx 1 jnet www-data 55 2011-08-07 13:50 a -> /home/someone/someotherthing/a lrwxrwxrwx 1 jnet www-data 55 2011-08-07 13:50 b -> /home/someone/someotherthing/b lrwxrwxrwx 1 jnet www-data 55 2011-08-07 13:50 c -> /home/someone/someotherthing/c lrwxrwxrwx 1 jnet www-data 55 2011-08-07 13:50 d -> /home/someone/someotherthing/d lrwxrwxrwx 1 jnet www-data 55 2011-08-07 13:50 e -> /home/someone/someotherthing/e /mnt/home/someone/something/subdir: total 4264 lrwxrwxrwx 1 jnet www-data 55 2011-08-07 13:50 a -> /home/someone/someotherthing/subdir/a lrwxrwxrwx 1 jnet www-data 55 2011-08-07 13:50 b -> /home/someone/someotherthing/subdir/b lrwxrwxrwx 1 jnet www-data 55 2011-08-07 13:50 c -> /home/someone/someotherthing/subdir/c lrwxrwxrwx 1 jnet www-data 55 2011-08-07 13:50 d -> /home/someone/someotherthing/subdir/d lrwxrwxrwx 1 jnet www-data 55 2011-08-07 13:50 e -> /home/someone/someotherthing/subdir/e 

Мне нужна команда, которая найдет все символические ссылки и ссылки на те же самые места, но под /mnt/home вместо /home

Существует ли такая команда?

  • Создать символическую ссылку в текущем каталоге
  • Найти только сообщения от symlink
  • 3 Solutions collect form web for “Как я могу «перемотать» много сломанных символических ссылок?”

    Нет команды переназначить символическую ссылку, все, что вы можете сделать, это удалить ее и создать другую. Предполагая, что у вас есть утилиты GNU (например, в не встроенных Linux или Cygwin), вы можете использовать -lname primary find для соответствия символических ссылок своей целью и readlink для чтения содержимого ссылки. Непроверенные:

     find /mnt/home/someone/something -lname '/home/someone/*' \ -exec sh -c 'ln -snf "/mnt$(readlink "$0")" "$0"' {} \; 

    Было бы лучше сделать эти символические ссылки относительными. Там есть удобная небольшая утилита, называемая symlinks (первоначально Mark Lords, теперь поддерживаемая Дж. Брандтом Бакли), представленная во многих дистрибутивах Linux. Перед перемещением или после восстановления правильных ссылок, как указано выше, запустите symlinks -c /mnt/home/someone/something чтобы преобразовать все абсолютные символические ссылки в указанном каталоге в относительные символические ссылки, если они не пересекают границу файловой системы.

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

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

    например. После изменения имени пользователя, чтобы заменить старое имя пользователя новым именем пользователя в целевом множестве ссылок, после того, как этот шаг уже сделан. Создайте скрипт под названием replace-simlinks, показанный ниже:

     #!/bin/bash link=$1 # grab the target of the old link target=$(readlink -- "$1") # replace the first occurrence of oldusername with newusername in the target string target=${target/oldusername/newusername} # Test the link creation echo ln -s -- "$target" "$link" # If the above echo shows the correct commands are being issued, then uncomment the following lines and run the command again #rm $link #ln -s "$target" "$link" 

    и вызовите его следующей командой:

     find /home/newusername/ -lname '/home/oldusername/*' -exec ~/bin/replace-simlinks {} \; 

    Надеюсь, это поможет кому-то

    edit: Спасибо Gilles за кикстарт на этом скрипте и совет об использовании скрипта symlinks, чтобы сделать ссылки относительными.

    Создайте /home как символическую ссылку на /mnt/home , и все существующие символические ссылки снова будут действительны.

    Interesting Posts

    Как восстановить отображение окна после отсоединения и повторной загрузки второго монитора?

    Автоматизация slappasswd

    Может ли файл .bash_profile быть автоматически получен после изменения?

    добавление текста в заголовок во всех корневых окнах

    Реагировать на входящие файлы в каталоге на HP-UX

    Рекурсивно удалять подкаталоги, не содержащие шаблона в OSX

    Копировать изображения ядра после обновления ядра

    Xrandr показывает экран без текущего / активного разрешения

    Debian 7: Gnome3 иногда останавливается при загрузке

    Как grep для 2 строк (условие AND) внутри блока, которые не находятся в одной строке, а затем найти что-то еще в этом же блоке

    Любая причина НЕ запускать Linux в виртуальной машине все время?

    AlphaServer 1000 4/266 в новой системе Alpha Server 1000A 5/333 DU3.2C

    Могу ли я установить крюк завершения синхронизации с помощью демона rsync?

    Являются ли прошивка маршрутизатора на основе Linux?

    Удалить все, кроме нескольких расширений

    Linux и Unix - лучшая ОС в мире.