Estou no meio do desenvolvimento de uma solução para o mesmo tipo de problema.
Basicamente, meu objetivo é um sistema que permite desfazer e refazer com granularidade em nível de arquivo.
Começando com sua pergunta e trabalhando de trás para frente ...
- Para comparar com a configuração padrão, temos que armazenar os originais de todos esses arquivos em algum lugar primeiro. Então podemos produzir o que você quer com algo como ...
DIFFDIR= ......
ARCDIR=./.archives # see below
function getlastarchive() {
... code to return last archived version ...
}
for FILE in /etc/*
do
ARCFILE="$(getlastarchive $FILE)"
diff $ARCDIR/$ARCFILE /etc/$FILE >$DIFFDIR/$FILE.diff
done
- Para armazenar os originais, optei por adotar a convenção de ter um único subdiretório
.archives
em qualquer diretório com um arquivo alterado. Ele é criado conforme necessário por um script file-archive
.
- Se você quiser apenas um nível de desfazer, só precisará copiar o arquivo inalterado para o diretório
.archives
antes que ele seja alterado.
- Para desfazer ilimitado, precisamos de um esquema de controle de versão. Uma escolha óbvia é um carimbo de data e hora anexado ao nome da versão arquivada. Algo como ...
Files: /etc/hosts
/etc/resolv.conf
Archived Versions: /etc/.archives/hosts.20121219015459
/etc/.archives/resolv.conf.20121219015459
- Em vez disso, estou usando apenas uma versão incremental calculada automaticamente, como em ...
Files: /etc/hosts
/etc/resolv.conf
Archived Versions: /etc/.archives/hosts.00
/etc/.archives/resolv.00.conf
- A versão # é antes da extensão, pois eu também uso isso para versões editadas de imagens que precisam de suas extensões (.jpg, .png, etc) intactas para que para ser detectado corretamente por um monte de software. Se um arquivo não tiver extensão, a versão # será anexada ao final. O código para fazer isso é mais complexo, mas é executado instantaneamente, sem problemas. Um caso pode ser feito para vários outros esquemas, mas isso funciona para mim.
Espero que isso ajude!