rm -rf не удаляет содержимое папки, а вместо этого создает еще одну пустую

rm -rf не удаляет содержимое папки, а вместо этого создает еще одну пустую

В настоящее время я пишу стартовый скрипт для игрового сервера Minecraft. В этот скрипт я включил резервный скрипт.

Этот скрипт резервного копирования работает почти идеально, но вместо удаления содержимого папки он просто создает другую (с похожим именем) и ничего не делает с целевой папкой.

Я использую эту команду: rm -rf "$MINECRAFT_PATH/server.log backups/*"
Эта команда выполняется в скрипте bash.

Переменная $MINECRAFT_PATHсодержит правильный путь. Созданная папка имеет это имя: server.log.backups(Обратите внимание на точку между logи backups). Но целевая папка имеет это имя: server.log backups. Эта папка существует, и это не проблема.

решение1

Двойные кавычки в Bash сохраняют большинство буквальных значений содержимого, поэтому ваш *глоб передается буквально в rm, который попытается удалить файл или папку с именем *. $MINECRAFT_PATHОднако подставляется .

Вероятно, вам нужно следующее:

rm -rf "$MINECRAFT_PATH/server.log backups/"*

Это приведет к удалению содержимого server.log backupsпапки.

Некоторые альтернативы:

  • Вы могли бы запрограммировать свой скрипт более защищенно, таким образом удалив -fопцию для rm. В этом случае он бы потерпел неудачу, если бы server.log backupsпапка была пуста, потому что глоб не был бы развернут и передан буквально, и не было бы файла с именем server.log backups/*.

  • Вы можете просто удалить rm -rfвсю папку и mkdir -pвсе остальное.

  • Или вы можете просто выполнить удаление всех файлов и папок внутри папки в глубину server.log backups. -mindepth 1Это предотвращает удаление родительского элемента:

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

Связанный контент