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

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

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

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

1 ответ1

2

Двойные кавычки в Bash сохраняют большинство литеральных значений содержимого, поэтому ваш * glob передается буквально в 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
    

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .