Gostaria de converter recursivamente links flexíveis em links físicos em um diretório. Eu tentei algo como isto:
for f in *; do (mv $f{,~} && ln $(readlink $f~) && rm $f~) done
... mas tem dois grandes problemas:
- não recursivo
- pega arquivos que não são links simbólicos
Seria bom, de alguma forma, alimentar a linha acima find -type l
, mas não sei como fazer isso.
bash
find
symbolic-link
Attila O.
fonte
fonte
cp -aH
). [1]: unix.stackexchange.com/questions/94185/…Respostas:
Este comando deve funcionar:
Como funciona:
find -type l
localiza todos os links no diretório atual.-exec bash -c '...' {} \;
chama bash para executar...
.Ele passa
{}
- o nome do link que está sendo processado atualmente - como um argumento, ao qual o bash pode acessar$0
.readlink -m "$0"
retorna o caminho absoluto do destino do link simbólico.ln -f "$(readlink -m "$0")" "$0"
sobrescreve (-f
) o link simbólico$0
com um link físico para seu destino.Se o link não puder ser convertido por algum motivo, ele permanecerá intocado e o ln imprimirá uma mensagem de erro.
fonte
bash
eln
?-e
opção corrige isso.brew install coreutils
efind * -type l -exec bash -c 'ln -f "$(greadlink -m "$0")" "$0"' {} \;
.