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

0

Atualmente, estou escrevendo um script de início para um servidor de jogo de minecraft. Nesse script, incluí um script de backup.

Este script de backup funciona quase perfeito, mas em vez de excluir um conteúdo de pastas, ele apenas cria outro (similarmente denominado) 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 esse nome: server.log backups . Esta pasta existe e este não é o problema.

    
por BrainStone 20.08.2013 / 17:08

1 resposta

2

Aspas duplas no Bash preservam a maioria dos valores literais do conteúdo, então o * 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 pasta server.log backups .

Algumas alternativas:

  • Você poderia programar seu script mais defensivamente, removendo assim a opção -f para rm . Nesse caso, falharia se a pasta server.log backups estivesse vazia, porque a glob não seria expandida e transmitida literalmente, e não haveria nenhum arquivo chamado server.log backups/* .

  • Você poderia simplesmente rm -rf a pasta inteira e mkdir -p depois.

  • Você também pode simplesmente fazer uma exclusão em profundidade de todos os arquivos e pastas dentro da pasta server.log backups . -mindepth 1 impede que o pai seja excluído:

    find "$MINECRAFT_PATH/server.log backups" -mindepth 1 -depth -delete
    
por 20.08.2013 / 17:23