Como criar links simbólicos para todos os arquivos (classe de arquivos) em um diretório?

26

Eu gostaria de criar links simbólicos ( ln -s ) para todos os arquivos (ou uma classe de arquivos, por exemplo, terminando com .bar ) em um determinado diretório. Digamos que eu esteja no cwd e digite ls ../source/*.bar me dá

foo.bar
baz.bar

como posso passar a lista de parâmetros para ln -s que finalmente resolve para

ln -s ../source/foo.bar
ln -s ../source/baz.bar

É claro que sei que posso escrever um script bash, mas deve haver algo mais simples envolvendo xargs ou mais, já que parece ser uma tarefa comum - pelo menos para mim.

    
por dastrobu 19.08.2013 / 10:39

3 respostas

53

ln recebe vários argumentos, mas não se esqueça de fornecer um diretório de destino nesse caso.

Então, no seu exemplo . é o diretório de destino, então deve ser tão fácil quanto

ln -s ../source/*.bar .

De man ln ; o comando acima usa a terceira forma:

ln [OPTION]... [-T] TARGET LINK_NAME   (1st form)
ln [OPTION]... TARGET                  (2nd form)
ln [OPTION]... TARGET... DIRECTORY     (3rd form)
ln [OPTION]... -t DIRECTORY TARGET...  (4th form)
  • In the 1st form, create a link to TARGET with the name LINK_NAME.
  • In the 2nd form, create a link to TARGET in the current directory.
  • In the 3rd and 4th forms, create links to each TARGET in DIRECTORY.
    
por 19.08.2013 / 10:54
3

Use find

certainDir="/path/to/dir"
find -name "*.bar" -exec ln -s {} "$certainDir" \;

Além disso, lembre-se de usar caminhos completos (onde possível) com links simbólicos.

    
por 19.08.2013 / 10:49
3

Você pode tentar recursivamente com o uso de globstar (bash / zsh definido por: shopt -s globstar ):

ls -vs ../**/*.bar .

Nota: Adicionado -v para detalhado.

Ou se a lista for muito longa, use find utility:

find .. -name \*.bar -exec ln -vs "{}" dest/ ';'

Isso criará links em dest/ ou alterará para . da pasta atual.

    
por 23.04.2015 / 18:43