2014-02-15 119 views
3

克隆使用符號鏈接的環境時,符號鏈接會複製(從生產到克隆),但它們仍指向原始(生產)文件。我想他們是指向克隆的文件,如:Linux - 使用單個命令更新多個符號鏈接

原文:

/production/symlink1 > /production/directory/file1 
/production/foo/symlink2 > /production/directory/sub/file2 

克隆後(現在):

/clone/symlink1 > /production/directory/file1 
/clone/foo/symlink2 > /production/directory/sub/file2 

我想:

/clone/symlink1 > /clone/directory/file1 
/clone/foo/symlink2 > /clone/directory/sub/file2 

是有一種方法可以用一個命令來實現它嗎?

+0

好問題,但偏離主題的SO;這屬於[su]或[unix.se] –

+1

如果你打算經常複製/克隆,那麼你應該考慮在生產機器上使用'ln -s ../directory/file1/production/symlink1' 。然後,將相關鏈接複製到'/ clone'或'/ some/other/location'時可以正常工作。不要低估相對符號鏈接的好處;請謹慎使用它們。 –

回答

1

你自己創建了鏈接嗎?如果是,您可以使用-r參數創建它們。見man ln

-r,--relative

  create symbolic links relative to link location 
+1

真的嗎?哪個版本的'ln'在哪個平臺上?這['ln'](http://linux.die.net/man/1/ln)手冊頁沒有提及'-r'。 _ [...時光流逝...] _好; ['ln']的主GNU手冊(http://www.gnu.org/software/coreutils/manual/coreutils.html#ln-invocation)描述了'-r';它可能無處不在。 –

1

如果鏈接是指向絕對路徑,它們總是指向相同的路徑複製後。這是絕對路徑的美麗,我認爲你不能解決這個問題。

雖然複製後可以嘗試重寫這些鏈接。例如,如果你創建一個腳本relink.sh這樣的:

#!/bin/bash 
for link; do 
    target=$(readlink "$link") 
    [[ $target =~ ^/production ]] || continue 
    newtarget=$(echo $target | sed -e s?/production?/clone?) 
    echo ln -snf "$newtarget" "$link" 
done 

傳遞符號鏈接的列表,這個腳本,它會檢查自己是否/production下指向了一些路徑,並重新與/production/clone替代的鏈接。你可以這樣稱呼它,例如:

find /clone -type l -exec ./relink.sh {} \;