renomeia os arquivos que correspondem ao valor mtime específico no diretório

1

Eu uso um conjunto simples de comandos shell para criar mysqldumps diariamente. O script é chamado pelo daemon do cron. Parece:

presentdate="'date +%d-%m-%Y_%H:%M.%S'"
basedir="/var/db_my_backup"
mysqldump -u username -ppassword --all-databases |
  gzip -9 -c > $basedir/mysqlbackup.$presentdate.sql.gz | 
  find -L $basedir/'*' -type f -mtime +7 exec rm -f {} \; |
  chown -R user:group $basedir | (
    cat <<EOF
Copy of MySQL successfully placed in $basedir directory as file named mysqlbackup.$presentdate.sql.gz. 
Now it is ready to be moved to QNAP backup device as scheduled.
EOF
    cat
  ) | /bin/mail -s "Report from scheduled job for mysqldumps" root

Minha preocupação é: como posso torná-lo mais elegante? Seria possível criar uma função para selecionar e renomear arquivos com mais de 7 dias? Eu não gosto de usar o find, pois ele produz avisos estranhos, como por exemplo:

find: paths must precede expression
Usage: find [-H] [-L] [-P] [path...] [expression]

que são difíceis de lidar (pelo menos para mim) em tal script.

    
por domaniqs 08.08.2012 / 13:37

1 resposta

1

Seu método de excluir backups antigos é bom e, na minha opinião, é melhor do que renomear arquivos. A coisa mais feia sobre isso é a longa cadeia de canos, que serve pouco propósito em seu exemplo, mas torna a linha muito longa. Eu escreveria usando um bloco de { ... } assim:

presentdate="'date +%d-%m-%Y_%H:%M.%S'"
basedir="/var/db_my_backup"
{
mysqldump -u username -ppassword --all-databases | gzip -9 -c > $basedir/mysqlbackup.$presentdate.sql.gz
find -L $basedir/'*' -type f -mtime +7 -exec rm -v {} \;
chown -vR user:group $basedir
cat <<EOF
Copy of MySQL successfully placed in $basedir directory as file named mysqlbackup.$presentdate.sql.gz. 
Now it is ready to be moved to QNAP backup device as scheduled.
EOF
} 2>&1 | /bin/mail -s "Report from scheduled job for mysqldumps" root

O 2>&1 perto do final é incluir a saída de erro no email, você pode removê-lo se não quiser. Eu também adicionei alguns -v flags para mais verbosidade.

Como um comentarista coloca, find não causa erros estranhos se você usá-lo corretamente. Houve um erro em seus parâmetros para find , usando exec em vez de -exec . Para obter os parâmetros certos, jogue com ele um pouco, enquanto estiver lendo man find .

    
por 08.08.2012 / 14:21