Ajuda com rsync exclui não funcionar

0

Estou tentando configurar o rsync para manter uma imagem na minha unidade externa atual. Eu tenho 4 partições para lidar com: /, / boot, / home, / usr. Eu quero montar cada um por vez e sincronizar cada um com a unidade interna. Um problema que estou tendo é que os arquivos excluídos não estão sendo excluídos. Eu experimentei alguns padrões, mas nenhum faz o truque. Estou definindo o padrão de exclusão em relação à fonte, mas não está funcionando.

Este fragmento de log do / home / sync mostra os arquivos excluídos sendo copiados:


    --begin snippet--
    backing up /home/ via rsync to: /media/Ubuntu_Backup...
    sudo rsync -a -x -i -h -v -A -X -H --delete --inplace --numeric-ids --compare-dest=./ -n --exclude='*/lost+found/**' --exclude='*/Downloads/**' --exclude='*/.cache/**' --exclude='*/.thumbnails' --exclude='*/.mozilla/firefox/*.default/Cache' /home/ /media/Ubuntu_Backup
    sending incremental file list
    .d..t...... kmiller/
    >f..t...... kmiller/.vim_mru_files
    >f.st...... kmiller/.viminfo
    >f.st...... kmiller/.zsh_history
    >f.st...... kmiller/backup.log
    >f.st...... kmiller/cron.log
    .d..t...... kmiller/.cache/google-chrome-beta/Default/Cache/
    *deleting   kmiller/.cache/google-chrome-beta/Default/Cache/f_000806
    >f..t...... kmiller/.cache/google-chrome-beta/Default/Cache/data_0
    >f..t...... kmiller/.cache/google-chrome-beta/Default/Cache/data_1
    >f..t...... kmiller/.cache/google-chrome-beta/Default/Cache/data_2
    >f..t...... kmiller/.cache/google-chrome-beta/Default/Cache/data_3
    >f+++++++++ kmiller/.cache/google-chrome-beta/Default/Cache/f_00080a
    >f+++++++++ kmiller/.cache/google-chrome-beta/Default/Cache/f_00080b
    >f+++++++++ kmiller/.cache/google-chrome-beta/Default/Cache/f_00080c
    >f+++++++++ kmiller/.cache/google-chrome-beta/Default/Cache/f_00080d
    >f+++++++++ kmiller/.cache/google-chrome-beta/Default/Cache/f_00080e
    --end of snippet--

O outro problema que eu estava tendo é que o rsync estava criando uma estrutura de diretório duplicada dentro do diretório de destino, isto é, um / usr / dir dentro do / usr no destino. o --compare-dest =. / pareceu parar isso, mas eu não entendo completamente o porquê.

Este é o script que estou desenvolvendo para fazer o trabalho:


#!/usr/bin/zsh
typeset -A FILESYSTEMS
typeset -A NAMES

MOUNTPOINT='/media/Ubuntu_Backup'
LOGFILE='/home/kmiller/backup.log'

OPTIONS=('-a') #archive
OPTIONS+=('-x') #don't cross file system boundaries
OPTIONS+=('-i') #itemize changes
OPTIONS+=('-h') #human readable output
OPTIONS+=('-v') #verbose
OPTIONS+=('-A') #preserve ACLS
OPTIONS+=('-X') #preserve extended attributes
OPTIONS+=('-H') #preserve hard links
OPTIONS+=('--delete') #delete extraneous
OPTIONS+=('--inplace') #update files directly (faster - no building temp copies)
OPTIONS+=('--numeric-ids') #no translation of UID,GID - needed for proper restores
OPTIONS+=('--compare-dest=./') #
OPTIONS+=('-n') #dry run

FILESYSTEMS=('/' '/dev/sdb6')
FILESYSTEMS+=('/boot/' '/dev/sdb1')
FILESYSTEMS+=('/usr/' '/dev/sdb8')
FILESYSTEMS+=('/home/' '/dev/sdb7')

ROOTEXCLUDES=("--exclude='boot/*'")
ROOTEXCLUDES+=("--exclude='usr/*'")
ROOTEXCLUDES+=("--exclude='home/*'")
ROOTEXCLUDES+=("--exclude='dev/*'")
ROOTEXCLUDES+=("--exclude='proc/*'")
ROOTEXCLUDES+=("--exclude='sys/*'")
ROOTEXCLUDES+=("--exclude='tmp/*'")
ROOTEXCLUDES+=("--exclude='run/*'")
ROOTEXCLUDES+=("--exclude='mnt/*'")
ROOTEXCLUDES+=("--exclude='media/*'")
ROOTEXCLUDES+=("--exclude='lost+found/*'")
ROOTEXCLUDES+=("--exclude='etc/fstab'")

BOOTEXCLUDES=("--exclude='lost+found/*'")
BOOTEXCLUDES+=("--exclude='grub/grub.cfg'")

USREXCLUDES=("--exclude='lost+found/*'")

HOMEEXCLUDES=("--exclude='*/lost+found/*'")
HOMEEXCLUDES+=("--exclude='*/Downloads/*'")
HOMEEXCLUDES+=("--exclude='*/.cache'")
HOMEEXCLUDES+=("--exclude='*/.thumbnails'")

NAMES=('/' 'ROOT' '/boot/' 'BOOT' '/usr/' 'USR' '/home/' 'HOME')

is_mounted () {
    mount | grep "$1" || return 1
    return 0
}

if [[ ! -d $MOUNTPOINT ]];then
    echo "creating $MOUNTPOINT..."
    sudo mkdir $MOUNTPOINT || {echo "$0 failed - Problem creating mount dir: $MOUNTPOINT" && exit;}
fi

rm -rf $LOGFILE

#unmount any target backup partitons if they happen to be mounted
for FS in ${(k)FILESYSTEMS};do
    if is_mounted ${FILESYSTEMS[$FS]};then
        sudo umount ${FILESYSTEMS[$FS]} || {echo "$0 - Problem unmounting: $MOUNTPOINT" && exit;}
    fi
done

echo -e "\nStarting partition backups..."
for FS in ${(k)FILESYSTEMS};do
    EXCLUDES=$(eval echo \$${NAMES[${FS}]}EXCLUDES)
    echo "-------------------------------------------------------"
    echo "mounting ${FS} partition: ${FILESYSTEMS[$FS]}..."
    sudo mount ${FILESYSTEMS[$FS]} $MOUNTPOINT || {echo "$0 - Problem mounting: ${FILESYSTEMS[$FS]} $MOUNTPOINT" && exit;}
    echo "backing up ${FS} via rsync to: $MOUNTPOINT..." | tee -a $LOGFILE 2>&1
    echo "sudo rsync ${OPTIONS} ${EXCLUDES} ${FS} /media/Ubuntu_Backup" >> ${LOGFILE} 2>&1
    eval sudo rsync ${OPTIONS} ${EXCLUDES} ${FS} /media/Ubuntu_Backup >> ${LOGFILE} 2>&1 || {echo -e "WARNING: rsync returned an error: $rc\nSee backup.out for details!" && exit;}
    df ${FILESYSTEMS[$FS]} | tee -a $LOGFILE 2>&1
    echo "unmounting ${FILESYSTEMS[$FS]}"
    sleep 2
    sudo umount ${FILESYSTEMS[$FS]} || {echo "$0 failed - Problem unmounting partition: ${FILESYSTEMS[$FS]}" && exit;}
done
echo -e "Finished partition backups...\n"

Qualquer conselho / insights são bem-vindos ...

    
por YMOZ 25.01.2014 / 22:38

1 resposta

1

Depois de fazer mais testes, percebi que, se eu executasse o comando rsync gerado no script na linha de comando, ele funcionaria perfeitamente. Portanto, eu só poderia supor que há algum problema com expansão ou interpretação dentro do ambiente de script que eu não entendo completamente. A correção é avaliar o comando rsync e editei a postagem original para refletir isso.

    
por YMOZ 26.01.2014 / 18:32