Como criar vários links para um arquivo?

3

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
    
por uc50ic4more 05.02.2017 / 00:11

4 respostas

5

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
    
por glenn jackman 05.02.2017 / 00:20
1

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)
    
por Sergiy Kolodyazhnyy 05.02.2017 / 03:13
0

Você precisa de dois comandos.

ln -s Desktop/foo.txt location1; ln -s Desktop/foo.txt location2
    
por Rmano 05.02.2017 / 00:20
0

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
    
por uc50ic4more 05.02.2017 / 00:50