rm -rf löscht den Ordnerinhalt nicht, sondern erstellt stattdessen einen neuen, leeren

rm -rf löscht den Ordnerinhalt nicht, sondern erstellt stattdessen einen neuen, leeren

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_PATHenthält den richtigen Pfad. Der erstellte Ordner hat diesen Namen: server.log.backups(Beachten Sie den Punkt zwischen logund 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_PATHwird jedoch ersetzt.

Was Sie wahrscheinlich möchten, ist:

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

Dadurch wird der Inhalt des server.log backupsOrdners gelöscht.

Einige Alternativen:

  • Du könntest dein Skript defensiver programmieren und so die -fOption für entfernen rm. In diesem Fall würde es bei einem server.log backupsleeren Ordner fehlschlagen, da der Glob nicht expandiert und wörtlich weitergegeben würde und es keine Datei mit dem Namen gäbe server.log backups/*.

  • Du könntest einfach rm -rfden gesamten Ordner öffnen und mkdir -pihn anschließend löschen.

  • Alternativ können Sie auch einfach eine Tiefenlöschung aller Dateien und Ordner im server.log backupsOrdner durchführen. -mindepth 1verhindert, dass das übergeordnete Element gelöscht wird:

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

verwandte Informationen