
Ich schreibe gerade ein Startskript für einen Minecraft-Spieleserver. In dieses Skript habe ich ein Backup-Skript integriert.
Dieses Sicherungsskript funktioniert nahezu perfekt, aber anstatt den Inhalt eines Ordners zu löschen, erstellt es einfach einen anderen (mit ähnlichem Namen) und tut nichts mit dem Zielordner.
Ich verwende diesen Befehl: rm -rf "$MINECRAFT_PATH/server.log backups/*"
Dieser Befehl wird in einem Bash-Skript ausgeführt.
Die Variable $MINECRAFT_PATH
enthält den richtigen Pfad. Der erstellte Ordner hat diesen Namen: server.log.backups
(Beachten Sie den Punkt zwischen log
und backups
). Aber der Zielordner hat diesen Namen: server.log backups
. Dieser Ordner existiert und das ist nicht das Problem.
Antwort1
Doppelte Anführungszeichen in Bash bewahren die meisten wörtlichen Werte des Inhalts, Ihr *
Glob wird also wörtlich an übergeben rm
, das versucht, eine Datei oder einen Ordner mit dem Namen zu entfernen *
. Das $MINECRAFT_PATH
wird jedoch ersetzt.
Was Sie wahrscheinlich möchten, ist:
rm -rf "$MINECRAFT_PATH/server.log backups/"*
Dadurch wird der Inhalt des server.log backups
Ordners gelöscht.
Einige Alternativen:
Du könntest dein Skript defensiver programmieren und so die
-f
Option für entfernenrm
. In diesem Fall würde es bei einemserver.log backups
leeren Ordner fehlschlagen, da der Glob nicht expandiert und wörtlich weitergegeben würde und es keine Datei mit dem Namen gäbeserver.log backups/*
.Du könntest einfach
rm -rf
den gesamten Ordner öffnen undmkdir -p
ihn anschließend löschen.Alternativ können Sie auch einfach eine Tiefenlöschung aller Dateien und Ordner im
server.log backups
Ordner durchführen.-mindepth 1
verhindert, dass das übergeordnete Element gelöscht wird:find "$MINECRAFT_PATH/server.log backups" -mindepth 1 -depth -delete