So finden und tar-Dateien dann löschen

0

Ich muss Dateien finden, die älter als 30 Tage sind, tarieren und komprimieren und diejenigen entfernen, die ich bereits tariert und 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 {} \;
R_Mat
quelle

Antworten:

0

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

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

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

Wenn Ihr tardieses Flag nicht unterstützt, 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"

Wenn Sie eine temporäre Datei zum Speichern der Liste verwenden, anstatt sie neu zu generieren, wird verhindert, dass eine Datei möglicherweise nicht alt genug für den tarBefehl ist. Zum Zeitpunkt der Erstellung des Archivs ist jedoch die Zeit abgelaufen und es stimmen mehr Dateien überein.

Vergewissern Sie sich, dass das -eim shebang (erste Zeile) enthalten ist. Wenn Sie es weglassen, ignoriert bash Fehler der ausgeführten Befehle, was möglicherweise zu Datenverlust führen kann.

Wüstengecko
quelle
Ich
erhalte
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 help | tree | search | stat | rates | opt | exec] [path ...] [expression]
R_Mat
@R_Mat Ich habe die Antwort zu diesem Teil verbessert und geklärt, siehe den bearbeiteten Code.
Wüstengecko
#! / bin / bash -e Dateiliste = "$ (mktemp)" find /u01/oracle/files/*.aud -mtime +30 -print0> "$ Dateiliste" tar -czvf "Dateiname _ $ (Datum +% Y- % m-% d) .tar.gz "--null -T" $ filelist "xargs -0 rm <$ filelist" rm "$ filelist"
R_Mat 20.10.18
Wenn ich es wie oben
ausführe, erhalte