web-dev-qa-db-fra.com

Comment créer plusieurs liens symboliques vers un fichier?

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
3
uc50ic4more

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
5
glenn jackman

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
1
uc50ic4more

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)
1
Sergiy Kolodyazhnyy

Vous avez besoin de deux commandes.

ln -s Desktop/foo.txt location1; ln -s Desktop/foo.txt location2
0
Rmano