
Atualmente estou escrevendo um script inicial para um servidor de jogos Minecraft. Neste script incluí um script de backup.
Este script de backup funciona quase perfeito, mas em vez de excluir o conteúdo de uma pasta, ele apenas cria outra (com nome semelhante) e não faz nada com a pasta de destino.
Estou usando este comando: rm -rf "$MINECRAFT_PATH/server.log backups/*"
Este comando é executado em um script bash.
A variável $MINECRAFT_PATH
contém o caminho correto. A pasta criada tem este nome: server.log.backups
(Observe o ponto entre log
e backups
). Mas a pasta de destino tem este nome: server.log backups
. Esta pasta existe e este não é o problema.
Responder1
As aspas duplas no Bash preservam a maioria dos valores literais do conteúdo, de modo que seu *
glob é passado literalmente para rm
, que tentará remover um arquivo ou pasta chamado *
. O $MINECRAFT_PATH
é substituído embora.
O que você provavelmente quer é:
rm -rf "$MINECRAFT_PATH/server.log backups/"*
Isso excluirá o conteúdo da server.log backups
pasta.
Algumas alternativas:
Você poderia programar seu script de forma mais defensiva, removendo assim a
-f
opção pararm
. Nesse caso, falharia se aserver.log backups
pasta estivesse vazia, pois o glob não seria expandido e repassado literalmente e não haveria nenhum arquivo chamadoserver.log backups/*
.Você poderia simplesmente
rm -rf
a pasta inteira emkdir -p
depois.Ou você também pode simplesmente fazer uma exclusão profunda de todos os arquivos e pastas dentro da
server.log backups
pasta.-mindepth 1
impede que o pai seja excluído:find "$MINECRAFT_PATH/server.log backups" -mindepth 1 -depth -delete