Portanto, minha solução desenvolvida pelo próprio usuário requer um pouco mais de script do que a a do Journeyman Geek . Eu usei unison
para a parte de sincronização e zenity
para avisar sobre conflitos.
Scripts
O script bash (coloque isso em seus aplicativos de inicialização):
#!/bin/bash
if [ -z "$(arp | grep MAC_ADDRESS_OF_NAS)" ]; then
zenity --warning --text="NAS not found. Aborting."
fi;
unison sync -batch=true -repeat=watch |& while read -r line; do
if test -n "$(echo $line | grep skipped:)"; then
zenity --warning --text="$line";
fi;
done
A configuração uníssono (coloque isso como sync.prf
em ~/.unison/
):
root=/home/my-username/the-data-i-want-to-backup/
root=/mnt/NAS/some/sub/path/
# follow all symlinks
follow = Path *
# automatically do everything (if there are no conflicts)
auto = true
# for some reason unison fails if I sync the permissions
perms = 0
dontchmod = true
Explicação detalhada (e solução de problemas para derivadas)
- Primeiro, verifique se o NAS está localizado na rede local.
Se o endereço MAC não aparecer na saída
arp
, presumo que não preciso sincronizar.
Isso provavelmente precisa de mais ajustes, já que raramente ligo o meu laptop completamente, então o script não será iniciado quando eu me conectar à rede.
Talvez eu adicione um cron job ou algum tipo de "conexão na rede"
-
zenity
pode ser usado para criar diálogos gráficos a partir de um script bash.
Você provavelmente precisará instalá-lo.
O uso básico é bastante simples.
-
unison sync
inicia a sincronização.
Ele procura por um perfil de configuração chamado ~/.unison/sync.prf
.
Eu poderia substituir sync
por outra coisa (tanto no nome do arquivo quanto no comando).
- Para pular arquivos conflitantes, eu especifico
-batch=true
.
Eu não faço isso no arquivo de configuração porque eu quero executar unison sync
manualmente se um conflito acontecer.
- Não preciso de uma ferramenta de terceiros para observar alterações:
-repeat=watch
faz exatamente o que eu quero.
Sidenote: na verdade, ele inicia uma ressincronização completa em qualquer alteração, portanto, pode ser melhor, mas tudo bem para mim.
- A saída do
unison
-command é um pouco estranha, demorou um pouco para que isso funcionasse:
- Se houver um conflito, a saída contém
skipped: FILENAME
- Isso parece acontecer no STDERR em vez de no STDOUT, então eu preciso canalizar com
|&
- Por algum motivo, não consegui descobrir que não funcionou com um simples
grep
para mim. Eu tentei algo como unison sync ... |& grep "skipped:" | xargs zenity --text="{}"
, mas isso não seria executado até que o uníssono finalmente terminasse (funcionou bem sem -repeat=
, e funcionou bem sem o grep
)
- Por razões acima eu fiquei com um laço while para ler a entrada e usar o grep somente em cada linha
- No perfil de uníssono, observe que usei caminhos absolutos. Por algum motivo, não funcionou com
~/my/folder
Notas adicionais
-
Sou alguém que tende a super engenharia. Eu configurei um script me gerando o unison-profile. Caso você esteja interessado:
#!/bin/bash
HOME_DIR=$(cd ~; pwd)
REPO_DIR="$(dirname "$(readlink -f $0)")"
UNISON_PRF=$HOME_DIR/.unison/sync.prf
# write sync script
read -e -p "Local sync dir: [like ~/Data] " LOCAL_SYNC_DIR
# make path absolute:
LOCAL_SYNC_DIR="${LOCAL_SYNC_DIR/#\~/$HOME_DIR}"
read -e -p "Remote sync dir: [like /mnt/NAS/Data/] " REMOTE_SYNC_DIR
REMOTE_SYNC_DIR="${REMOTE_SYNC_DIR/#\~/$HOME_DIR}"
rm "$UNISON_PRF"
echo "root=$LOCAL_SYNC_DIR" > "$UNISON_PRF"
echo "root=$REMOTE_SYNC_DIR" >> "$UNISON_PRF"
cat "$REPO_DIR/sync.prf" >> "$UNISON_PRF"
# user info
echo "IMPORTANT: You need to put $REPO_DIR/unison/sync.sh to your startup applications for this to work properly!"