Você tem alguns problemas com a prática de codificação em seu código.
- Você gostaria de verificar o sucesso desses comandos, especialmente quando o próximo comando depender do sucesso do anterior.
- Deixar uma variável sem aspas no contexto de lista é pedir ao shell para dividi-lo e executar a geração de nome de arquivo nele, não há motivo para fazer isso aqui.
Agora, sobre rm -r
, é necessário excluir o diretório e todo o seu conteúdo. Ele não seguirá links simbólicos ao fazer isso. Mesmo que /home/fauna/backup/$oldday
seja um link simbólico, apenas esse link simbólico será removido. Isso é provavelmente o que você quer aqui. Seria diferente se você fizesse rm -r "/home/fauna/backup/$oldday/"
(com o /
).
No entanto, sem -f
, isso significa que, se stdin for um terminal, você poderá ser solicitado a remover arquivos não graváveis. Então, se é para ser um script autônomo, você provavelmente deve adicioná-lo. Também com -f
, rm
reporta falha se o diretório ainda estiver lá depois.
#!/bin/sh -
day=$(date +%m%d%y) || exit
oldday=$(date -d "-4 days" +%m%d%y) || exit
# date is very unlikely to fail, but if it does, it would have dramatic consequences
# shouldn't access to those directories be restricted (if it hasn't been
# restricted already some levels above)?
# umask 077
mkdir -p "/home/fauna/backup/$day" || exit
# with -p, mkdir would only fail if the directory is not there after that call.
# It may not be what you want though. You may want mkdir to fail if the
# directory already existed in which case you'd want to omit the -p.
cp /home/fauna/backup/backup.sh "/home/fauna/backup/$day" || exit
cd "/home/fauna/backup/$day" || exit
./backup.sh || exit
# only delete the old one if the new one succeeds.
rm -rf "/home/fauna/backup/$oldday"
Observe que, como estamos adicionando || exit
a todos os comandos, podemos usar também set -e
, o que faz com que o shell seja encerrado após qualquer erro de qualquer comando, mas eu prefiro || exit
, como explicito que você considerou o tratamento de erros (e set -e
tem muitas dicas para serem usadas de forma confiável (não neste caso simples aqui)).