Command-Line

如何“重新連結”很多損壞的符號連結?

  • February 21, 2022

我有一個目錄樹,其中有一堆符號連結到/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

我想要一個命令,它會找到所有的符號連結並重新連結到相同的地方,但在下面/mnt/home而不是/home

這樣的命令存在嗎?

沒有重新定位符號連結的命令,您所能做的就是刪除它並創建另一個。假設您有 GNU 實用程序(例如在非嵌入式 Linux 或 Cygwin 下),您可以使用-lname主要的find來匹配符號連結的目標,並readlink讀取連結的內容。未經測試:

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

最好使這些符號連結相對。在許多 Linux 發行版中都有一個方便的小實用程序symlinks(最初由 Mark Lord,現在由 J. Brandt Buckley 維護)。

在移動之前或如上所述恢復有效連結之後,執行symlinks -c /mnt/home/someone/something以將指定目錄下的所有絕對符號連結轉換為相對符號連結,除非它們跨越文件系統邊界。

引用自:https://unix.stackexchange.com/questions/18360