Cria automaticamente os arquivos de diretório symlink em outro diretório

1

Sempre que adicionar algo a ~/config/ , gostaria que ele fosse vinculado por symlink em ~ . Eu não quero correr ln -s todas as vezes.

    
por Hatshepsut 05.09.2016 / 21:49

1 resposta

1

Existe iwatch utility, isso pode ser feito. No meu Ubuntu eu instalei o pacote iwatch para obtê-lo. Pode ser usado como daemon ou ferramenta de linha de comando.

Não posso garantir que as soluções abaixo sejam infalíveis e bem escritas. Trate-os como uma prova de conceito.

Linha de comando

Em meus testes, não consegui fazer com que a única instância de iwatch realizasse uma ação quando um arquivo fosse criado, mas outra ação, quando fosse removido. Talvez você possa fazer isso de alguma forma. Decidi analisar sua saída e depois decidir ( case statement) o que fazer. Execute isto:

cd ~/config
iwatch -e create,moved_to,delete,moved_from -c "printf '%s %s\n' %e %f" ./ |
while read -r e f ; do
   f="$(basename "$f")"
   case $e in
      *IN_CREATE|*IN_MOVED_TO)
         ln -s "config/$f" "../$f"
      ;;
      *IN_DELETE|*IN_MOVED_FROM)
         test -L "../$f" && rm "../$f"
   esac
done

Jogue com touch , mkdir , mv , rm etc. em ~/config em outro console para testar a solução.

Notas:

  • Links simbólicos são criados para novos arquivos / diretórios, eles são removidos quando os destinos são removidos; mv também é coberto.
  • Isso funciona bem para mim, mesmo com nomes um pouco problemáticos, como foo bar ou a"b .
  • Durante a criação: se já houver um objeto em ~/ ocupando o nome, nenhum link simbólico será criado para sobrescrevê-lo - sem perda de dados.
  • Durante a remoção: os links simbólicos com nomes próprios são removidos, independentemente de para onde apontam, os links não simbólicos permanecem intactos graças a test -L … .

Daemon

O daemon iwatch lê seu arquivo de configuração, você pode dizer o que fazer. Não só eu tive um problema definindo duas ações diferentes, mas também escapando de alguns caracteres dentro do arquivo de configuração. A solução mais fácil era chamar o script bash para fazer o trabalho.

Antes de começar, observe:

  • Os caminhos devem ser absolutos, modifique-os para se adequar ao seu caso.
  • Também USERNAME precisa ser modificado no arquivo de configuração e no script.

Este é o snippet para colar no arquivo de configuração ( /etc/iwatch/iwatch.xml no meu sistema operacional) antes de </config> :

<watchlist>
    <title>symlinks</title>
    <contactpoint email="USERNAME@localhost" name="USERNAME"/>
    <path type="single" events="create,moved_to,delete,moved_from" alert="off" exec="/home/USERNAME/bin/link_config %e %f">/home/USERNAME/config</path>
</watchlist>

(Você pode querer remover a seção padrão watchlist , se houver).

O caminho para o script é /home/USERNAME/bin/link_config . Este é o script rápido e sujo:

#!/usr/bin/env bash

p="/home/USERNAME"
e="$1"
f="$(basename "$2")"

case "$e" in
    *IN_CREATE|*IN_MOVED_TO)
        ln -s "config/$f" "$p/$f"
        ;;
    *IN_DELETE|*IN_MOVED_FROM)
        [ -L "$p/$f" ] && rm "$p/$f"
esac

Eu acho que se você omitir os asteriscos ( * ) e deixar nua IN_CREATE etc., o script irá ignorar os diretórios criados em /home/USERNAME/config ; talvez seja isso que você gosta mais. Isso se aplica também à versão da linha de comando.

Torne o script executável:

chmod u+x /home/USERNAME/bin/link_config

Defina outras permissões conforme necessário. O daemon irá executá-lo como root de qualquer maneira (pelo menos no meu sistema operacional foi assim).

Inicie / reinicie / recarregue o daemon e divirta-se.

    
por 04.10.2016 / 00:45