Der Befehl funktioniert nicht, da für jede gefundene Datei find
eine neue tar
Instanz aufgerufen wird, und jede tar
Instanz überschreibt die Archivdatei mit einer neuen, die nur die eine Datei enthält, von der sie geliefert wurde find
. Sie möchten find
eine 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 tar
unterstützt, fügen Sie das --remove-files
Flag hinzu, um Quelldateien zu entfernen, die erfolgreich komprimiert wurden.
Wenn Sie tar
dieses 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 tar
Befehl 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 -e
in den Shebang (erste Zeile) einschließen . Wenn Sie es nicht angeben, ignoriert bash Fehler der ausgeführten Befehle, was zu Datenverlust führen kann.