Dateien, die älter als 7 Tage sind, automatisch löschen

17

Ich bin ein absoluter Neuling unter Linux, aber ich fange an, den Dreh raus zu kriegen. Ich besitze einen Ubuntu Server 16.04, auf dem ein FTP-Server zum Sichern von Sicherheitsvideodateien ausgeführt wird. Die Dateien werden in Ordnern gespeichert werden wie: /home/securityfolder1, /home/securityfolder2, /home/securityfolder3und so weiter.

Beachten Sie, dass jeder securityfolderNBenutzer ein anderer ist.

Da meine Festplatten nicht ständig voll sein sollen, möchte ich täglich Dateien in diesen Ordnern löschen, die älter als 7 Tage sind.

Jacco van de Wijgaart
quelle
/homeenthält normalerweise einen Unterordner für jeden Benutzer. Wenn Sie Ihre Backups nicht als unterschiedliche Benutzer speichern möchten (keine gute Idee), sollten Sie einen anderen Speicherort in Betracht ziehen, z /home/security/backup1. B. und so weiter.
Melebius
@ Melebius danke für deinen Kommentar, jeder / securityfolder ist ein anderer Benutzer, das habe ich vergessen zu erwähnen.
Jacco van de Wijgaart

Antworten:

26

Zunächst werden mit diesem Befehl alle Dateien gesucht und gelöscht, die älter als 7 Tage sind und sich in einem Unterverzeichnis befinden, in dem der /homeName beginnt mit securityuser:

find /home/securityuser* -mtime +6 -type f -delete

Sie brauchen -mtime +6und nicht +7weil -mtime24h Perioden zählt. Wie im -atimeAbschnitt von man find( -mtimefunktioniert auf die gleiche Weise) erklärt:

   -atime n
          File  was  last  accessed n*24 hours ago.  When find figures out
          how many 24-hour periods ago the file  was  last  accessed,  any
          fractional part is ignored, so to match -atime +1, a file has to
          have been accessed at least two days ago.

Um eine Datei zu finden, die vor 7 oder mehr Tagen geändert wurde, müssen Sie also nach Dateien suchen, die vor mehr als 6 Tagen geändert wurden -mtime +6.

Der nächste Schritt besteht darin, diesen Befehl einmal am Tag auszuführen. Da jeder securityuserNBenutzer ein anderer ist (möglicherweise möchten Sie dieses Setup überdenken, was alles komplizierter macht), muss dies als root ausgeführt werden. Also, editiere /etc/crontab:

sudo nano /etc/crontab

Und füge diese Zeile hinzu:

@daily root find /home/securityuser* -mtime +6 -type f -delete

Dadurch wird der findBefehl einmal täglich ausgeführt und die Dateien gelöscht.

terdon
quelle
+1 Den Nagel ein wenig tiefer gehen lassen und vielleicht Melebius 'Vorschlag an OP wiederholen, dass find '/home/securityuser/*' -mtime +6 -type f -delete(bei allen relevanten und angemessenen Änderungen in der Benutzererstellung) im Allgemeinen eine bessere Idee sein könnte als find '/home/securityuser*' -mtime +6 -type f -delete(kein Schrägstrich im Pfad) ...?
Cbhihe
@Cbhihe nein, die Zielverzeichnisse werden aufgerufen /home/securityuserN, ohne den Schrägstrich werden sie also nicht gefunden.
Terdon
yup, sah das; Ich fand es einfach nicht empfehlenswert, von OP aus (für jedes Sicherheitsvideo einen eigenen Benutzer zu erstellen, usw.), wie es Melebius 'erster Kommentar ausdrückte, auch wenn OP möglicherweise seine Gründe dafür hat. Mein Kommentar war eher lahm, keine Kritik an deiner guten und vollständigen Antwort.
Cbhihe
1
+1 Von mir. Beachten Sie nur ein Detail, als ich dies auf RHEL ausführte: Der Platzhalter hat auf dem Pfad nicht funktioniert. Ich musste es auf den -name:find /home/ -name 'securityuser*' -mtime +6 -type f -delete
Stelios Adamantidis
1
@SteliosAdamantidis oh wow, das habe ich komplett verpasst! Ja, die Originalversion würde nicht funktionieren, da ich zitiert hatte 'securityuser*'. Der Platzhalter sollte durch die Shell erweitert werden, nicht durch find, also sollte es gewesen sein securityuser*(keine Anführungszeichen). Siehe aktualisierte Antwort. Danke für den Hinweis, Stelio, ich kann nicht glauben, dass es noch niemandem aufgefallen ist! Ti vlakas!
Terdon
4

Nach meinem Wissen:

versuche den findBefehl so:

find ./dirc/* -mtime +6 -type f -delete

./dirc/* : is your directory (Path)
-mtime +6 : modified more than 6 days ago (therefore, at least 7 days ago)
-type f : only files
-delete : no surprise. Remove it to test before like rm
Maulik Patel
quelle
Vielen Dank für Ihre Antwort. Bedeutet ./dirc/*: ./home/securityfolder1/* oder ist das falsch?
Jacco van de Wijgaart
Ich habe es gerade in meiner Virtualbox als ausprobiert find /home/jacco/ -mtime +1 -type f -deleteund es scheint zu funktionieren. Wie kann ich das automatisieren?
Jacco van de Wijgaart
Erstellen Sie eine Skriptdatei und führen Sie diesen Befehl mithilfe von Skript aus, wenn dies funktioniert. Führen Sie dann Ihre Skriptdatei beim Startvorgang aus.
Maulik Patel
Ich bin wie der Supernoob hier, weil der Teil der Erstellung des Skripts, bedeutet dies eine Datei mit #!/bin/bashund den Code darunter? oder bin ich hier wirklich dumm?
Jacco van de Wijgaart
2
@ Melebius nein, der Pfad sollte nicht in Anführungszeichen gesetzt werden, insbesondere wenn er Glob-Zeichen enthält. Sie möchten, dass es durch die Shell erweitert wird, und das Zitieren würde dies blockieren. Versuchen Sie , zum Beispiel: find '/u*' -name local. -name "foo*"Solche Direktiven sollten in Anführungszeichen gesetzt werden, wenn sie Glob-Zeichen enthalten.
Terdon