%20em%20um%20diret%C3%B3rio%3F.png)
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. Diga que estou 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 ela finalmente resolva
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, xargs
pois parece ser uma tarefa comum - pelo menos para mim.
Responder1
ln
aceita 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 3ª 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)
- No 1º formulário, crie um link para TARGET com o nome LINK_NAME.
- Na 2ª forma, crie um link para TARGET no diretório atual.
- Nas 3ª e 4ª formas, crie links para cada TARGET no DIRETÓRIO.
Responder2
Você pode tentar recursivamente usando globstar (bash/zsh definido por shopt -s globstar
:):
ls -vs ../**/*.bar .
Nota: Adicionado -v
para verboso.
Ou se a lista for muito longa, use find
o utilitário:
find .. -name \*.bar -exec ln -vs "{}" dest/ ';'
Isso criará links dest/
ou alterará .
para a pasta atual.
Responder3
Usarfind
certainDir="/path/to/dir"
find -name "*.bar" -exec ln -s {} "$certainDir" \;
Além disso, lembre-se de usarcaminhos completos(quando possível) com links simbólicos.
Responder4
cp
com -s
a opção pode criar links virtuais (ou -l
para links físicos).
Do diretório atual pode ser usado assim:
$ cp -s ../path/with/scripts/* .
No seu caso será assim:
$ cp -s ../source/*.bar .