Command-Line
如何“重新連結”很多損壞的符號連結?
我有一個目錄樹,其中有一堆符號連結到
/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
以將指定目錄下的所有絕對符號連結轉換為相對符號連結,除非它們跨越文件系統邊界。