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.