Linux: Sicheres rekursives Löschen in Skripts

478
lennelei

Ich arbeite an automatisierten Skripten, die auf einer Linux-Box (Debian) ausgeführt werden. Diese Skripts werden von einem Scheduler aus gestartet und bearbeiten Dateien in ihren eigenen Verzeichnissen.

Am Ende der Skripte muss ich temporäre Dateien löschen.

Momentan habe ich so etwas:

#check that some variables are not empty if [[ -z $var1 || -z $var2 || -z $var3 ]]; then echo "Some var is empty" exit 1 fi workingdir=$var1/$var2 #some checks on working directory if [[ ! -d $workingdir ]]; then echo "Directory error" exit 1 fi cd $workingdir if [[ $(pwd) != $workingdir ]]; then echo "Change directory error" exit 1 fi #...here goes the main part of the script #and at the end, the "cleaning" if [[ -d $workingdir/temp/$var3 ]]; then find $workingdir/temp/$var3 -delete; fi 

Haben Sie eine Idee, die ich verwenden könnte, um das Risiko zu verringern, dass etwas falsches entfernt wird?

Vielen Dank.

Grüße

0
Das Erste: [`" doppelte Anführungszeichen $ variables "`] (https://mywiki.wooledge.org/Quotes#When_Should_You_Quote.3F). Kamil Maciorowski vor 5 Jahren 1
Vielen Dank für diesen Link. Ich habe jetzt schon eine Weile gesucht und bin mir nicht sicher, wie man innerhalb einer for / loop mit Wildcard doppelte Anführungszeichen setzt? Soll ich die Variable nur in Anführungszeichen setzen und den Platzhalter so auslassen? `für f in" $ workingdir "*; tun ... ' lennelei vor 5 Jahren 0
Ich sehe keine solche Syntax in der Frage. Sie sollten keine neuen Fragen in Kommentaren stellen. Ein zitiertes "*" wird nicht erweitert. Warum versuchst du es nicht "echo" $ workingdir "*`, `echo" $ workingdir * "`, `echo" $ workingdir "/ *` und `echo" $ workingdir / * "` und überzeugst dich selbst? Kamil Maciorowski vor 5 Jahren 0
Es tut mir leid für die Frage, ich werde einen neuen Beitrag eröffnen. lennelei vor 5 Jahren 0

1 Antwort auf die Frage

1
Ljm Dullaart

Ihr Skript weiß, welche Dateien erstellt werden und wo sie sich befinden.

Diese allgemeine Aussage ist hier ein wichtiger Punkt. Wenn Sie wirklich nur die Dateien löschen möchten, die Sie erstellt haben, behalten Sie den Überblick darüber, welche Dateien Sie erstellen. So würden Sie normalerweise Folgendes tun:

TMP1=$(mktemp -t example.1.XXXXXX) TMP2=$(mktemp -t example.2.XXXXXX) 

um Ihre temporären Dateien zu erstellen (siehe man mktempEinzelheiten) und

rm -f "$TMP1" "$TMP2" 

Wenn Sie mit den Temp-Dateien fertig sind. Alternativ können Sie ein temporäres Verzeichnis erstellen und dieses löschen.

Etwas, das Sie nicht tun sollten, ist

rm -f /tmp/example.?.* 

weil es die temporären Dateien auch für andere laufende Instanzen des Skripts entfernt.

Eigentlich ist es etwas komplizierter: Das Skript startet einen Java-Job, der die Variablen $ workingdir und $ var3 verwendet, um temporäre Daten im Ordner $ workingdir / temp / $ var3 zu speichern. Ich möchte diesen Ordner nicht innerhalb des Java-Jobs entfernen, da ich ihn möglicherweise benötige (zum Beispiel bei einem Fehler). Deshalb habe ich nach Ideen gesucht, um das Skript zu sichern. lennelei vor 5 Jahren 0
Der wichtigste Punkt ist, dass Sie die von Ihrem Skript (oder Java-Code) erstellten temporären Dateien im Auge behalten müssen. Sie können nur entscheiden, welche Dateien gelöscht werden sollen, wenn Sie wissen, was sie sind. Ljm Dullaart vor 5 Jahren 0