So finden und tar-Dateien löschen und löschen

434
R_Mat

Ich muss Dateien suchen, die älter als 30 Tage sind, tar tarieren und komprimieren und diejenigen entfernen, die ich bereits tar komprimiert habe.

Ich habe versucht, so etwas auszuführen, aber es sieht nicht so aus, als würde es funktionieren

find /u01/oracle/files -mtime +30 -exec tar -czvf filename_$(date +%Y-%m-%d).tar.gz /u01/oracle/files {} \; 
0

1 Antwort auf die Frage

0
Wüstengecko

Der Befehl funktioniert nicht, da für jede gefundene Datei findeine neue tarInstanz aufgerufen wird, und jede tarInstanz überschreibt die Archivdatei mit einer neuen, die nur die eine Datei enthält, von der sie geliefert wurde find. Sie möchten findeine vollständige Liste aller Dateien zusammenstellen und diese Liste dann an eine einzelne übergeben tar:

find /u01/oracle/files -mtime +30 -print0 | tar -czvf filename_$(date +%Y-%m-%d).tar.gz --null -T /dev/stdin 

Wenn Ihre Version es tarunterstützt, fügen Sie das --remove-filesFlag hinzu, um Quelldateien zu entfernen, die erfolgreich komprimiert wurden.

Wenn Sie tardieses Flag nicht unterstützen, können Sie stattdessen dieses Skript verwenden:

#!/bin/bash -e filelist="$(mktemp)" find /u01/oracle/files -mtime +30 -print0 > "$filelist" tar -czvf "filename_$(date +%Y-%m-%d).tar.gz" --null -T "$filelist" xargs -0 rm < "$filelist" rm "$filelist" 

Die Verwendung einer temporären Datei zum Speichern der Liste anstelle einer Neuerstellung verhindert, dass eine Datei für den tarBefehl möglicherweise nicht als veraltet angesehen wird. Zum Zeitpunkt der Erstellung des Archivs ist jedoch die Zeit abgelaufen, und mehr Dateien stimmen überein.

Stellen Sie sicher, dass Sie das -ein den Shebang (erste Zeile) einschließen . Wenn Sie es nicht angeben, ignoriert bash Fehler der ausgeführten Befehle, was zu Datenverlust führen kann.

Ich erhalte diese Fehlermeldung, wenn ich versuche, das letzte auszuführen R_Mat vor 5 Jahren 0
oracle $ find / u01 / oracle / files -mtime +60 -print0> /tmp/filelist.txt tar -czvf Dateiname _ $ (Datum +% Y-% m-% d) .tar.gz --null -T / tmp /filelist.txt xargs -0 rm </tmp/filelist.txt rm /tmp/filelist.txt find: Pfade müssen vor dem Ausdruck stehen: tar Verwendung: find [-H] [-L] [-P] [-Olevel] [ -D Hilfe | Baum | Suche | Stat | Tarife | Opt | Exec] [Pfad ...] [Ausdruck] R_Mat vor 5 Jahren 0
@R_Mat Ich habe die Antwort zu diesem Teil verbessert und geklärt. Siehe den bearbeiteten Code. Wüstengecko vor 5 Jahren 0
#! / bin / bash -e filelist = "$ (mktemp)" find /u01/oracle/files/*.aud -mtime +30 -print0> "$ filelist" tar -czvf "Dateiname _ $ (Datum +% Y- % m-% d) .tar.gz "--null -T" $ filelist "xargs -0 rm <" $ filelist "rm" $ filelist " R_Mat vor 5 Jahren 0
Wenn ich es so ausführt, erhalte ich diesen Fehler R_Mat vor 5 Jahren 0
rm: fehlender Operand Versuchen Sie "rm --help", um weitere Informationen zu erhalten. R_Mat vor 5 Jahren 0
Dies bedeutet wahrscheinlich, dass keine Dateien gefunden wurden. Führen Sie einfach den Befehl "find" ohne etwas anderes aus und entfernen Sie den Teil "-print0> $ filelist", damit er an die Konsole ausgegeben wird. (Sie wollten es wahrscheinlich wie `find / u01 / oracle / files -name '* .aud' -mtime ...`. Nennen.) Wüstengecko vor 5 Jahren 0
Vielen Dank, dass mein Problem gelöst wurde! R_Mat vor 5 Jahren 0