2010-08-08 15 views
9

Estoy intentando almacenar todos mis archivos de configuración de perfil (~/.xxx) en git. Soy bastante horrible en bash scripting, pero me imagino que esto será bastante sencillo para los gurús de scripting.¿Script Bash para crear enlaces simbólicos de forma segura?

Básicamente, me gustaría un script que va a crear enlaces simbólicos en mi directorio de archivos en mi repo. Twist es, me gustaría advertir y solicitar sobrescribir si el enlace simbólico va a sobrescribir un archivo real. También debería indicar si se sobrescribirá un enlace de Sym, pero la ruta de destino es diferente.

No me importa editar manualmente el script para cada enlace que quiero crear. Me preocupa más poder implementar rápidamente nuevas secuencias de comandos de configuración ejecutando esta secuencia de comandos almacenada en mi repositorio.

¿Alguna idea?

Respuesta

14

El comando ln ya es conservadora en cuanto al borrado, así que tal vez el enfoque beso es lo suficientemente bueno para usted:

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

Si un archivo o enlace ya existe, recibirá un mensaje de error y el Este enlace se ser salteado

si desea que los archivos que tienen un nombre diferente en su repositorio, pase la opción -n-ln para que no accidentalmente crear un enlace simbólico en un subdirectorio existente de ese nombre:

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

Si también desea tener enlaces en los subdirectorios de su directorio personal, cp -as reproduce la estructura del directorio pero crea enlaces simbólicos para los archivos normales. Con la opción -i, indica si ya existe un objetivo.

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

(Mi respuesta supone GNU y GNU lncp, tales como que iba a encontrar en Linux (y Cygwin) pero por lo general no en otros sistemas Unix.)

+1

+1 para las cp -s, ¡no sabía que existiera! RTFM ¿verdad? – Mosby

1

las siguientes tiene condiciones de carrera, pero es probablemente lo más seguro posible sin las transacciones del sistema de archivos:

# 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" 
Cuestiones relacionadas