Wie finde und lösche ich Dateien, die älter sind als bestimmte Tage in Unix?


38

Ich habe einen Ordner für das Protokoll mit 7 Ordnern. Diese sieben Ordner enthalten ebenfalls Unterordner, und diese Unterordner enthalten ebenfalls Unterordner. Ich möchte alle Dateien, die älter als 15 Tage sind, in allen Ordnern einschließlich Unterordnern löschen, ohne die Ordnerstruktur zu berühren, dh nur Dateien.

mahesh@inl00720:/var/dtpdev/tmp/ > ls
A1  A2  A3  A4  A5  A6  A7

mahesh@inl00720:/var/dtpdev/tmp/A1/ > ls
B1 B2 B3 B4 file1.txt file2.csv

Antworten:


54

Du könntest damit anfangen zu sagen find /var/dtpdev/tmp/ -type f -mtime +15. Dadurch werden alle Dateien gefunden, die älter als 15 Tage sind, und ihre Namen gedruckt. Optional können Sie -printam Ende des Befehls angeben , dies ist jedoch die Standardaktion. Es ist ratsam, zuerst den obigen Befehl auszuführen, um zu sehen, welche Dateien ausgewählt sind.

Nachdem Sie überprüft haben, dass der findBefehl die Dateien auflistet, die Sie löschen möchten (und keine anderen), können Sie eine "Aktion" hinzufügen, um die Dateien zu löschen. Die typischen Aktionen dazu sind:

  1. -exec rm -f {} \;(oder gleichwertig -exec rm -f {} ';')
    Dies wird rm -ffür jede Datei ausgeführt. z.B,

    rm -f /var/dtpdev/tmp/A1/B1; rm -f /var/dtpdev/tmp/A1/B2; rm -f /var/dtpdev/tmp/A1/B3; …
    
  2. -exec rm -f {} +
    Dies wird rm -ffür viele Dateien gleichzeitig ausgeführt. z.B,

    rm -f /var/dtpdev/tmp/A1/B1 /var/dtpdev/tmp/A1/B2 /var/dtpdev/tmp/A1/B3 …
    

    Daher ist es möglicherweise etwas schneller als Option 1. ( rm -fWenn Sie über Tausende von Dateien verfügen , muss es möglicherweise einige Male ausgeführt werden.)

  3. -delete
    Dies sagt findsich, die Dateien zu löschen, ohne ausgeführt zu werden rm. Dies ist zwar um ein Vielfaches schneller als die -execVarianten, funktioniert jedoch nicht auf allen Systemen.

Wenn Sie also Option 2 verwenden, lautet der gesamte Befehl:

find /var/dtpdev/tmp/ -type f -mtime +15 -exec rm -f {} +

Die Verwendung von -delete ist einfacher (Syntax und keine zu löschenden untergeordneten Prozesse), funktioniert jedoch möglicherweise nicht auf allen Systemen. rm -f {} + ist am besten, es löscht Dateien in Stapeln, wenn es genug Dateien gibt, um für eine Befehlszeile zu viel zu sein. rm -f {} ';' Gibt einen zu langen Fehler aus, wenn genügend Dateien für eine Befehlszeile vorhanden sind.
Gaoithe

-1

Oder mach es mit einer Schleife:

for x in $(find /var/dtpdev/tmp/ -type f -mtime +15); do rm "$x"; done

Dies funktioniert nicht bei Dateien mit Leerzeichen.
Drav Sloan

Sie können stattdessen eine while-Schleife verwenden, die sich um Dateien mit Leerzeichen kümmert. find / var / dtpdev / tmp / -type f -mtime +15 | während x gelesen wird; mache rm "$ x"; erledigt
David Okwii
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.