Verifique a página do manual - você pode especificar apenas um destino. Você terá que fazer um loop:
for destination in /location/one /location/two ...; do
ln -s ~/Desktop/foo "$destination"
done
Como eu poderia criar um link simbólico que cria vários links para um arquivo?
Gostaria que ~/Desktop/foo.txt
"aparecesse" em vários locais; e o seguinte não funciona:
ln -s ~/Desktop/foo.txt /location/one /location/two
Verifique a página do manual - você pode especificar apenas um destino. Você terá que fazer um loop:
for destination in /location/one /location/two ...; do
ln -s ~/Desktop/foo "$destination"
done
Um one-liner de Python relativamente simples pode fazer o trabalho:
$ 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
A maneira como isso funciona é simples. Usamos o módulo sys
para processar argumentos de linha de comando e usamos a função symlink()
do módulo os
. A função map()
é usada essencialmente como substituto do loop for
, que recebe uma função e lista como argumento. Aqui, a função é lambda x:os.symlink(sys.argv[1],x)
e será executada para cada item na lista sys.argv[2:]
.
Observe que ~/input.txt
é o arquivo original (chamado de sys.argv[1]
, segundo argumento de linha de comando) e ~/Desktop/input.txt
e ~/Pictures/input.txt
são links simbólicos resultantes. Eles são os argumentos 2 e 3, portanto, usamos sys.argv[2:]
list slice começando do 3º item até o final da lista. Você pode estar se perguntando, bem, onde está o primeiro argumento. Isso é -c
flag.
Uma forma de script da mesma coisa seria
#!/usr/bin/env python
import sys,os
for item in sys.argv[2:]:
os.symlink(sys.argv[1],item)
Você precisa de dois comandos.
ln -s Desktop/foo.txt location1; ln -s Desktop/foo.txt location2
Para referência, para copiar paletas de cores .gpl nos diretórios apropriados do GIMP, Inkscape e LibreOffice, fiz o seguinte:
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