Excluindo o diretório antigo

1

Estou tentando adicionar uma maneira de remover backups com mais de três dias atrás no meu script.

Veja abaixo uma versão simplificada simplificada, que apenas deixa a parte de remoção.

Entendi que ${BACKUP_DEST[$i]}/$OLDBACKUP deveria produzir algo como '/ Users / christopherdavies / Desktop / sync / test1.co.uk/07-06-18'.

No entanto, cada vez que isso é executado, ele exclui a pasta acima, de 'test1.co.uk', e independentemente de ter 3 dias ou não.

Alguém é capaz de me apontar na direção certa? Eu não fui capaz de fazer nenhum progresso ... par fresco de olhos?

#!/bin/sh

WEBSITE_HOST=(
    "[email protected]"
    "[email protected]"  
)

BACKUP_DEST=(
    "/Users/christopherdavies/Desktop/rsync/test1.co.uk"
    "/Users/christopherdavies/Desktop/rsync/test2.co.uk"
)

OLDBACKUP='date -d "3 days ago" +"%d%m%Y"'

SITE_COUNT=${#WEBSITE_HOST[@]}

for (( i = 0; i < SITE_COUNT; i++ )); do

    # Remove old backups    
    if [ -d "${BACKUP_DEST[$i]}/$OLDBACKUP" ]; then rm -Rf ${BACKUP_DEST[$i]}/$OLDBACKUP; fi

done
exit 0
    
por ccdavies 09.06.2018 / 09:05

1 resposta

3

O utilitário date no macOS (que presumo que você esteja usando a julgar pela localização dos diretórios home do usuário) não é GNU date e, portanto, não suporta todos os seus recursos.

Isso significa que a variável OLD_BACKUP estará vazia (e você deverá ver uma mensagem de erro quando date for executado), o que significa que é o diretório ${BACKUP_DEST[$i]} que é excluído.

Em vez disso, você pode usar date -v -3d +'%d-%m-%Y' .

#!/bin/bash

set -e

backup_dest=(
    '/Users/christopherdavies/Desktop/rsync/test1.co.uk'
    '/Users/christopherdavies/Desktop/rsync/test2.co.uk'
)

when=$( date -v -3d +'%d-%m-%Y' )

for backup in "${backup_dest[@]}"; do
    [ -d "$backup/$when" ] && rm -Rf "$backup/$when"
done

Alternativamente, instale GNU coreutils e use o GNU date .

Outras alterações feitas no seu código:

  • Removido exit 0 do final e adicionado set -e . Se o script falhar, você poderá ser capaz de perceber isso.

  • O array do website não foi usado.

  • Faz um loop sobre os itens na matriz, em vez de usar índices, é mais fácil de ler.

  • Se você quiser uma instrução if simples de linha única, poderá usar a sintaxe de curto-circuito (que é menor).

  • Use nomes de variáveis em minúsculas.

  • Sempre cite expansões de variáveis.

  • É um script bash , portanto, deve referir-se a bash na linha #! .

por 09.06.2018 / 09:26