Converter links simbólicos para hard links

19

Gostaria de converter recursivamente links suaves em links diretos em um diretório. Eu tentei algo assim:

for f in *; do (mv $f{,~} && ln $(readlink $f~) && rm $f~) done

... mas tem dois problemas principais:

  • não recursivo
  • seleciona arquivos que não são links simbólicos

Seria bom, de alguma forma, alimentar a linha acima com find -type l , mas não sei como fazer isso.

    
por Attila O. 04.03.2013 / 14:30

1 resposta

27

Este comando deve funcionar:

find -type l -exec bash -c 'ln -f "$(readlink -m "$0")" "$0"' {} \;

Como funciona:

  • find -type l localiza todos os links no diretório atual.

  • -exec bash -c '...' {} \; chama o bash para executar ... .

    Ele passa {} - o nome do link que está sendo processado no momento & traço; como um argumento, que o bash pode acessar como $0 .

  • readlink -m "$0" retorna o caminho absoluto do destino do link simbólico.

  • ln -f "$(readlink -m "$0")" "$0" overwrites ( -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á intacto e ln imprimirá uma mensagem de erro.

    
por 04.03.2013 / 15:14