Der Befehl funktioniert nicht, da für jede gefundene Datei find
eine neue tar
Instanz aufgerufen wird und jede tar
Instanz die Archivdatei mit einer neuen überschreibt, die nur die Datei enthält, von der sie bereitgestellt wurde find
. Sie möchten find
eine 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 tar
unterstützt, fügen Sie das --remove-files
Flag hinzu, um Quelldateien zu entfernen, die erfolgreich komprimiert wurden.
Wenn Ihr tar
dieses 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 tar
Befehl ist. Zum Zeitpunkt der Erstellung des Archivs ist jedoch die Zeit abgelaufen und es stimmen mehr Dateien überein.
Vergewissern Sie sich, dass das -e
im shebang (erste Zeile) enthalten ist. Wenn Sie es weglassen, ignoriert bash Fehler der ausgeführten Befehle, was möglicherweise zu Datenverlust führen kann.