2010-08-08 66 views
9

我试图在git中存储所有我的配置文件配置文件(〜/ .xxx)。我对bash脚本非常恐怖,但我想这对于你的脚本大师来说是非常简单的。Bash脚本安全地创建符号链接?

基本上,我想要一个脚本,将在我的主目录中创建符号链接到我的回购中的文件。 Twist是,我希望它会发出警告,并提示如果符号链接将覆盖实际文件,则会进行覆盖。它还应该提示是否会覆盖sym连接,但目标路径不同。

我不介意手动编辑我想要创建的每个链接的脚本。我更关心能否通过运行存储在我的仓库中的脚本来快速部署新的配置脚本。

任何想法?

回答

14

ln命令已经是保守约擦除,所以或许KISS的做法是配不上你:

ln -s git-stuff/home/.[!.]* . 

如果一个文件或链接已经存在,你会得到一个错误信息,该链接将被跳过。

如果要将这些文件都在你的仓库不同的名称,通过-n选项ln,这样不小心在该名称的现有子目录创建符号链接:

ln -sn git-stuff/home/profile .profile 
... 

如果您还希望在主目录的子目录中有链接,cp -as可以重现目录结构,但会为常规文件创建符号链接。使用-i选项,它会提示目标是否已存在。

cp -i -as git-stuff/home/.[!.]* . 

(我的回答假设GNU ln和GNU cp,比如你会发现在Linux(和Cygwin),但通常不会在其他Unix系统)。

+1

+1对于cp -s,我不知道存在! RTFM的权利? – Mosby 2013-04-30 20:33:39

1

下已经竞争条件,但它是可能与没有文件系统交易时一样安全:

# create a symlink at $dest pointing to $source 
# not well tested 
set -e # abort on errors 
if [[ (-h $dest && $(readlink -n "$dest") != $source) || -f $dest || -d $dest ]] 
then 
    read -p "Overwrite $dest? " answer 
else 
    answer=y 
fi 
[[ $answer == y ]] && ln -s -n -f -v -- "$source" "$dest"