
В настоящее время я пишу стартовый скрипт для игрового сервера 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