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
oua"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.