Bash, localizar e excluir arquivos antigos

1

Escreva um script para arquivos de backup e exclua backups antigos:

#!/bin/sh

BACKUPDIR=/var/backups/files
ROTATE=1

mkdir -p $BACKUPDIR

CURRENT="$BACKUPDIR/'date +%Y-%m-%d'-files.tar.gz"

cd /var/ && tar czf $CURRENT www

find $BACKUPDIR -type f -mtime $ROTATE -exec rm {} \;

chmod 0600 $BACKUPDIR/*

Linha de comando (para teste):

find $BACKUPDIR -type f -mtime $ROTATE -exec rm {} \;

De alguma forma, o script não funciona. No entanto, se eu o executar no console, tudo estará OK e os arquivos antigos serão excluídos. Mas se eu executar o script, os arquivos não serão excluídos (o arquivo tar será criado quando eu executar o script). Por quê?

As permissões de script são 755 .

    
por FoxDev 27.07.2015 / 07:00

1 resposta

0

Como sugerido por Fiximan, você provavelmente quer usar a opção -delete , embora isso não faça nenhuma diferença na sua situação, se você batesse em um nome de arquivo com espaços ou outros caracteres especiais, seu script falharia.

#!/bin/sh -e

BACKUPDIR=/var/backups/files

# I suggest a little more than 1 day (i.e. about 1 week of backups is
# probably safer.)
ROTATE=7

mkdir -p $BACKUPDIR

CURRENT="$BACKUPDIR/'date +%Y-%m-%d'-files.tar.gz"

# Create protected file, then backup data in it
touch $CURRENT
chmod 600 $CURRENT
cd /var/ && tar czf $CURRENT www

# Here we have the attempt at deleting, notice the "+"
find $BACKUPDIR -type f -name '*-files.tar.gz' -mtime +$ROTATE -delete

Algumas coisas:

  1. ROTATE=1 parece não fazer muito sentido, você provavelmente quer mais de um backup, apenas por precaução. Você costuma perceber que algo está errado em alguns dias ... boa sorte se você tiver um backup apenas da noite anterior!

  2. chmod 600 $CURRENT deve ser feito o mais rápido possível; Se você realmente tem medo da segurança do arquivo, faça-o antes de criar o tarball (como mostrado na minha amostra).

  3. Corrija o find adicionando um + na frente do número $ROTATE . Isso é algo que me pega a cada vez, então não se sinta mal. Na verdade, se você usar + tem a média de mais antiga ou igual , e se você usar '-', o teste será invertido (então -mtime +7 é mais ou menos equivalente a ! -mtime -7 - provavelmente dentro de 1 dia entre os quais não é provável que corresponda a um lado ou outro.) Com um número simples como você usou ( -mtime 1 ), ele excluirá arquivos que foram modificados naquele dia específico. Se esse script não for executado por três dias, esses três arquivos nunca serão excluídos.

  4. Use o -delete para não precisar pensar nas cotações perdidas em seu código de amostra (ou seja, -exec rm "{}" \; ), caso o nome do arquivo inclua caracteres especiais.

  5. Sugiro que você adicione um -name porque você tem uma maneira simples de saber se o arquivo em questão é um backup. Isto é apenas por segurança. Se você nunca colocou nenhum outro arquivo nesse diretório (como uma cópia de um backup que deseja manter por um período mais longo), então não é necessário.

  6. Adicionar a opção -e no hash bang ( #!/bin/sh -e ) é uma boa ideia para que o script pare no primeiro erro. Às vezes, os scripts são executados, geram erros e você nunca os vê.

por 25.08.2016 / 23:42