Você não pode usar rsync --delete
desta forma. É stateless e não mantém registro de quais arquivos foram deletados entre as execuções. O sinalizador --delete
simplesmente instrui rsync
a excluir todos os arquivos no destino que não existem na origem.
Para implementar essa exclusão restrita, acho que você precisa manter seu próprio estado. Nem rsync
nem unison
podem fazer isso por você.
O seguinte não é uma solução completa de erro; é um ponto de partida. (No entanto, ele lida com arquivos com nomes estranhos - incluindo aqueles que contêm uma nova linha incorporada.)
Suponha que dois diretórios src
e dst
. (Para os propósitos do exemplo, não importa se dst
é local ou remoto.)
# Find the current list of files (do this just once, to prep the cache)
( cd src && find . -type f -print0 ) | LC_ALL=C sort -z > .state.src
Sempre que realizamos um backup, execute o seguinte código
# Run the rsync to transfer files. "dst/" could be local
rsync -av src/ remote:dst/
# Determine the set of files to delete in "dst/"
( cd src && find . -type f -print0 ) | LC_ALL=C sort -z | tee .state.src.new |
LC_ALL=C comm -z - -13 .state.src |
ssh remote 'while IFS= read -d "" -r f; do rm -f "dst/$f"; done'
# That seemed to work, so update the state cache
[[ 0 -eq $? ]] && mv -f .state.src.new .state.src
Se a sua versão do comm
(como o meu) for mais antiga que o GNU coreutils 8.25 e não tiver o -z
flag, você poderá usar esta alternativa alternativa:
# Find the current list of files (do this just once, to prep the cache)
( cd src && find . -type f -print0 ) | tr '# Run the rsync to transfer files. "dst/" could be local
rsync -av src/ remote:dst/
# Determine the set of files to delete in "dst/"
( cd src && find . -type f -print0 ) | tr '# Find the current list of files (do this just once, to prep the cache)
( cd src && find . -type f -print0 ) | LC_ALL=C sort -z > .state.src
\n' '\n# Run the rsync to transfer files. "dst/" could be local
rsync -av src/ remote:dst/
# Determine the set of files to delete in "dst/"
( cd src && find . -type f -print0 ) | LC_ALL=C sort -z | tee .state.src.new |
LC_ALL=C comm -z - -13 .state.src |
ssh remote 'while IFS= read -d "" -r f; do rm -f "dst/$f"; done'
# That seemed to work, so update the state cache
[[ 0 -eq $? ]] && mv -f .state.src.new .state.src
' | LC_ALL=C sort | tee .state.src.new |
LC_ALL=C comm -13 - .state.src |
tr '# Find the current list of files (do this just once, to prep the cache)
( cd src && find . -type f -print0 ) | tr '# Run the rsync to transfer files. "dst/" could be local
rsync -av src/ remote:dst/
# Determine the set of files to delete in "dst/"
( cd src && find . -type f -print0 ) | tr '%pre%\n' '\n%pre%' | LC_ALL=C sort | tee .state.src.new |
LC_ALL=C comm -13 - .state.src |
tr '%pre%\n' '\n%pre%' |
ssh remote 'while IFS= read -d "" -r f; do rm -f "dst/$f"; done'
# That seemed to work, so update the state cache
[[ 0 -eq $? ]] && mv -f .state.src.new .state.src
\n' '\n%pre%' | LC_ALL=C sort > .state.src
\n' '\n%pre%' |
ssh remote 'while IFS= read -d "" -r f; do rm -f "dst/$f"; done'
# That seemed to work, so update the state cache
[[ 0 -eq $? ]] && mv -f .state.src.new .state.src
\n' '\n%pre%' | LC_ALL=C sort > .state.src
Sempre que realizamos um backup, execute o seguinte código
%pre%