Comment pourrais-je créer un lien symbolique qui crée plusieurs liens vers un fichier?
Je voudrais que ~/Desktop/foo.txt
apparaisse dans plusieurs endroits; et ce qui suit ne fonctionne pas:
ln -s ~/Desktop/foo.txt /location/one /location/two
Consultez la page de manuel - vous ne pouvez spécifier qu’une destination. Vous devrez faire une boucle:
for destination in /location/one /location/two ...; do
ln -s ~/Desktop/foo "$destination"
done
Pour référence, afin de copier les palettes de couleurs .gpl dans les répertoires GIMP, Inkscape et LibreOffice appropriés, je l’ai fait:
read -e -p "Enter filename: " file
for destination in ~/.config/libreoffice/4/user/config/ ~/.config/inkscape/palettes/ ~/.gimp-2.8/palettes/ ...; do
ln --symbolic --backup --force "$file" "$destination"
done
Relativement simple python one-liner peut faire le travail:
$ python -c 'import sys,os;map(lambda x:os.symlink(sys.argv[1],x),sys.argv[2:])' ~/input.txt ~/Desktop/input.txt ~/Pictures/input.txt
$ ls -l ~/Desktop/input.txt
lrwxrwxrwx 1 xieerqi xieerqi 23 2月 4 19:10 /home/xieerqi/Desktop/input.txt -> /home/xieerqi/input.txt
La façon dont cela fonctionne est simple. Nous utilisons le module sys
pour le traitement des arguments de ligne de commande et la fonction symlink()
du module os
. La fonction map()
sert essentiellement à remplacer la boucle for
, qui prend en argument une fonction et une liste. Ici, la fonction est lambda x:os.symlink(sys.argv[1],x)
et sera exécutée pour chaque élément de la liste sys.argv[2:]
.
Remarque: ~/input.txt
est le fichier d'origine (désigné par sys.argv[1]
, deuxième argument de ligne de commande), et ~/Desktop/input.txt
et ~/Pictures/input.txt
sont des liens symboliques résultants. Ce sont les arguments 2 et 3, donc nous utilisons sys.argv[2:]
la tranche de liste à partir du 3ème élément jusqu'à la fin de la liste. Vous vous demandez peut-être où se trouve le premier argument. C'est le drapeau -c
.
Une forme de script de la même chose serait
#!/usr/bin/env python
import sys,os
for item in sys.argv[2:]:
os.symlink(sys.argv[1],item)
Vous avez besoin de deux commandes.
ln -s Desktop/foo.txt location1; ln -s Desktop/foo.txt location2