Ersetzen Sie Ihren find
Befehl mit diesem und versuchen Sie es erneut,
find /var/log -type f -mtime +7
Das wird funktionieren:
#!/bin/bash
files=()
while IFS= read -r -d $'\0'; do
files+=("$REPLY")
done < <(find /var/log/ -mtime +7 -print0)
tar cvfz backup.tar.gz "${files[@]}"
Beachten Sie die Verwendung von "${files[@]}"
im Gegensatz zu ${files[*]}
. "${files[@]}"
wird erweitert, um tar
bereitzustellen mit einem Argument pro Dateiname und funktioniert auch dann, wenn die Dateinamen Leerzeichen, Tabulatoren oder Zeilenumbrüche enthalten. Im Gegensatz dazu expandiert die Shell ${files[*]}
, führt es eine Wortaufteilung durch, wodurch möglicherweise Ihre Dateinamen verstümmelt werden.
Für eine detaillierte Erklärung der Schleife, die zum Erstellen von files
verwendet wird array, siehe:How can I store find command result as arrays in Bash
Alle Dateien und Verzeichnisse, die durch den Befehl find /var/log/ -mtime +7
erzeugt werden wird in tar
aufgenommen Datei. Um nur Dateien einzuschließen, keine Verzeichnisse, lesen Sie die Antwort von Skynet.
Zum Archivieren von Protokollen der letzten sieben Tage
Es muss nur ein Zeichen geändert werden:
#!/bin/bash
files=()
while IFS= read -r -d $'\0'; do
files+=("$REPLY")
done < <(find /var/log/ -mtime -7 -print0)
tar cvfz backup.tar.gz "${files[@]}"
Das funktioniert, weil find
interpretiert numerische Argumente wie folgt:
Numerische Argumente können als angegeben werden
+n für größer als n,
-n für weniger als n,
n für genau n.
Also -mtime +7
bedeutet älter als 7 Tage, während -mtime -7
bedeutet weniger als 7. Beachten Sie, dass find
ignoriert Bruchteile. Also +7
umfasst 8 Tage alt, aber nicht 7,5 Tage alt. Siehe man find
für Details.