rm -rf não exclui o conteúdo da pasta, mas cria outra vazia

rm -rf não exclui o conteúdo da pasta, mas cria outra vazia

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_PATHcontém o caminho correto. A pasta criada tem este nome: server.log.backups(Observe o ponto entre loge 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 backupspasta.

Algumas alternativas:

  • Você poderia programar seu script de forma mais defensiva, removendo assim a -fopção para rm. Nesse caso, falharia se a server.log backupspasta estivesse vazia, pois o glob não seria expandido e repassado literalmente e não haveria nenhum arquivo chamado server.log backups/*.

  • Você poderia simplesmente rm -rfa pasta inteira e mkdir -pdepois.

  • Ou você também pode simplesmente fazer uma exclusão profunda de todos os arquivos e pastas dentro da server.log backupspasta. -mindepth 1impede que o pai seja excluído:

    find "$MINECRAFT_PATH/server.log backups" -mindepth 1 -depth -delete
    

informação relacionada