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;
mvtambém é coberto. - Isso funciona bem para mim, mesmo com nomes um pouco problemáticos, como
foo baroua"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
USERNAMEprecisa 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.