Confuso com este comando `find` em um script Bash?

8

Eu tenho um script bash, criado por alguém que não é mais capaz de explicar o significado, usado para tarar automaticamente uma pasta e fazer backup dela. No momento, estou confuso com a linha final:

find '/home/_backups/pokebrawl' -mtime +6 -type f -delete

O script completo está abaixo.

#!/bin/bash
#Purpose = Backup of Important Data
#Created on 17-1-2012
#Author = Hafiz Haider
#Version 1.0
#START
TIME=$(date +"%m-%d-%Y-%T")
FILENAME=pokebrawl-$TIME.tar.gz
SRCDIR=/home/servers/brawl/world
DESDIR=/home/_backups/pokebrawl
tar -cpzf $DESDIR/$FILENAME $SRCDIR
find '/home/_backups/pokebrawl' -mtime +6 -type f -delete
#END
MODS Excluir conta
fonte
3
Sem perguntas de acompanhamento, uma pergunta por pergunta. Você pode fazer quantas perguntas quiser. Portanto, clique em fazer pergunta, depois faça outra pergunta, não a adicione na parte inferior de outra.
ctrl-alt-delor

Respostas:

11

O findcomando excluirá qualquer arquivo regular no /home/_backups/pokebrawldiretório ou abaixo dele com mais de sete dias (ou mais precisamente, não modificado na última semana).

Ele deve provavelmente ler

find "$DESDIR" -mtime +6 -type f -delete

ou

find "${DESDIR:?Not set correctly}" -mtime +6 -type f -delete

já que existe uma variável perfeitamente boa mantendo esse nome de diretório. A segunda variação causaria um erro se, DESDIRpor algum motivo, estivesse vazia ou não definida.

Suponho que essa seja uma maneira de manter apenas os backups da semana passada. Eu sugeriria o uso de algo parecido borgbackupou resticnão, pois eles seriam capazes de manter os backups por muito mais tempo sem usar muito mais espaço (mesmo os backups por hora durante um ano não ocupariam muito espaço se os dados não estivessem mudando muito) . Eles fazem a desduplicação de dados e borgbackuptambém suportam a compactação (ambos também suportam backups remotos e criptografia).

Para executar o script a cada 24 horas (meia-noite), use um trabalho cron.

Primeiro, emita o comando crontab -e. Isso abriria um editor com o crontab atual para o usuário ativo (pode ou não ser um arquivo vazio).

Então adicione

@daily /path/to/the/script.sh

(onde path/to/the/script.shé o nome do caminho do script).

Salve e saia do editor.

O script agora seria chamado à meia-noite, até à noite.

Deseja executar o script às, digamos, 13:30 todas as tardes, adicione o seguinte como a entrada crontab:

30 13 * * * /path/to/the/script.sh

Consulte o manual do crontab no seu sistema para obter detalhes sobre como escrever uma programação do crontab ( man 5 crontab).

Kusalananda
fonte
1
No aspecto Provavelmente deve ler : Eu vi alguns scripts evitar deliberadamente usar uma variável de ambiente ao fazer esse tipo de find/ deleteoperação, caso alguns idiotas se esqueçam de defini-la $DESDIRou configurá-la para "/" ou algo do tipo por engano.
steve
@steve Bem, se DESDIRfor alterado e o findcomando não for atualizado, não será possível limpar o diretório correto. Possivelmente seria útil usar ${DESDIR:?Not set correctly}algo semelhante.
Kusalananda
5
find '/home/_backups/pokebrawl' -mtime +6 -type f -delete

Ele localiza todos os arquivos no diretório /home/_backups/pokebrawlque não foram modificados nos últimos +6dias e os exclui. NOTA: +6equivale a 7 dias.

Veja man findcomo essas opções funcionam:

$ man find
...
   -mtime n
          File's data was last modified n*24 hours ago.  See the comments 
          for -atime to understand how rounding affects the interpretation 
          of file modification times.

Nas distros do Redhat, você pode simplesmente colocar esse script no diretório /etc/crondailye ele será executado todos os dias. Você pode ver que já existem outros scripts que podem ser usados ​​como exemplos:

$ sudo ls -l /etc/cron.daily/
total 12
-rwx------. 1 root root 219 Aug  1  2017 logrotate
-rwxr-xr-x. 1 root root 618 Mar 17  2014 man-db.cron
-rwx------. 1 root root 208 Nov  4  2016 mlocate
slm
fonte