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

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

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

    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

    Усекать при необходимости при перемещении файла в файловую систему с более коротким NAME_MAX

    Clone установлена ​​с использованием аппаратной синхронизации RAID 0 + 1

    .Характивный файл пуст

    Как я буду строить маршрутизатор на основе Linux?

    Debian и Windows 8 UEFI с двойной загрузкой на отдельных дисках

    Как установить трехмерные мониторы с помощью Kali Linux?

    Как использовать отпечаток пальца для дешифрования папки, зашифрованной с помощью ecryptfs?

    переименовывать имена файлов на основе некоторых вычислений

    Любой способ восстановить список открытых вкладок / окон терминала перед моей системой неожиданно упал?

    Переменные ls, regexp и environment

    Unix: вопрос о xargs

    bash расширяется до того же значения вместо значения строки за строкой в ​​команде sed

    Как выложить 5 минут от отметки времени Unix?

    Как перекомпилировать exim4-daemon-heavy?

    dd, cat & openssl: размер блока и размер буфера

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