O ;
no final do comando executado por find
a -exec
deve ser citado para protegê-lo do shell. O shell o verá como o final do comando find
.
Alterar
find /var/production-backup/ -mtime +7 -exec rm -rf {} ;
para
find /var/production-backup/ -mtime +7 -exec rm -rf {} ';'
ou para
find /var/production-backup/ -mtime +7 -exec rm -rf {} \;
ou apenas
find /var/production-backup/ -mtime +7 -delete
se o seu find
for compatível.
Observe também que o comando find
não faz distinção entre diretórios, arquivos ou outras coisas em /var/production-backup
. Se, por exemplo, o diretório /var/production-backup
em si não tiver sido modificado em mais de sete dias (porque nenhum arquivo ou diretório foi criado / excluído), toda a hierarquia de arquivos será excluída.
Se você pretende excluir apenas arquivos comuns, use
find /var/production-backup/ -type f -mtime +7 -delete
Relacionados:
Outras notas sobre o seu código:
Se você fizer
TAR=$(which tar)
e depois use
$TAR ...
para criar um arquivo tar
, você também pode usar tar
diretamente. Não há nenhum benefício em definir TAR
para o caminho do tar
binário com which
, pois isso seria pesquisar o PATH
da mesma forma que usar tar
diretamente. O mesmo vale para os outros comandos que você armazena em variáveis.
O teste [ '$MKDIR -p "$PRODBACKDIR"' ]
deve ser um teste diretamente no status de retorno de mkdir
. O utilitário mkdir
não produz saída que você possa testar. Você também não precisa testar a existência do diretório antes de usar mkdir -p
:
if mkdir -p "$PRODBACKDIR"; then
echo 'Directory Created for site'
fi
Observe também que você está usando {$PRODBACKDIR}
, que adicionará {
e }
ao nome do caminho do diretório. Como é feito em um teste de diretório inútil, nenhum dano foi causado (o teste sempre falhou). Você também não precisa de echo -e
aqui.
Você não precisa de {}
em torno dos nomes das variáveis nas expansões de variáveis. O único local em que você precisa escrever ${variable}
é quando a expansão faz parte de uma sequência em que o caractere imediatamente a seguir é um caractere válido em um nome de variável, como em "${variable}x"
. Você do precisa dar o dobro de todas as expansões de variáveis.
A opção --progress
para rsync
é escrita com dois traços, não um. Além disso, -e ssh
é, até onde eu sei, o padrão para rsync
desde há muito tempo.
A linha
FILENAME=$(echo $DOC | awk -F '/' '{print $NF}');
poderia ser escrito usando uma substituição de parâmetro padrão como
FILENAME=${DOC##*/}
Você raramente precisa testar contra $?
. Por exemplo, em vez de
tar ...
if [ $? -eq 0 ]; then ...
faça
if tar ...; then ...
Considere também usar printf
para gerar dados variáveis.
Você está definindo TODAY_DATE
como uma string que contém a data de hoje, mas você a usa apenas duas vezes. Há pelo menos três outras invocações de date
com um formato ligeiramente diferente ... (também, %Y-%m-%d
pode ser substituído por %F
, consulte man strftime
).
Você não precisa de ;
no final dos comandos que não são imediatamente seguidos por outros comandos na mesma linha. Newline funciona como um terminador de comando.
Etc., ...
Também gostaria de sugerir que você analisasse o software de backup existente. Eu poderia recomendar borgbackup
e restic
, por exemplo.
Relacionados: