Sostituisci il tuo find
comando con questo e riprova,
find /var/log -type f -mtime +7
Funzionerà:
#!/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[@]}"
Nota l'uso di "${files[@]}"
al contrario di ${files[*]}
. "${files[@]}"
si espanderà per fornire tar
con un argomento per nome di file e funzionerà anche se i nomi di file contengono spazi, tabulazioni o caratteri di nuova riga. Al contrario, dopo che la shell si espande ${files[*]}
, eseguirà la suddivisione delle parole, alterando potenzialmente i nomi dei file.
Per una spiegazione dettagliata del ciclo utilizzato per creare il files
array, vedi:Come posso memorizzare il risultato del comando find come array in Bash
Tutti i file e le directory prodotti dal comando find /var/log/ -mtime +7
sarà incluso nel tar
file. Per includere solo i file, non le directory, vedi la risposta di Skynet.
Per archiviare i log degli ultimi sette giorni
È necessario modificare solo un carattere:
#!/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[@]}"
Funziona perché find
interpreta gli argomenti numerici come segue:
Gli argomenti numerici possono essere specificati come
+n per maggiore di n,
-n per meno di n,
n per esattamente n.
Pertanto, -mtime +7
significa più vecchio di 7 giorni mentre -mtime -7
significa minore di 7. Nota che find
ignorerà le parti frazionarie. Così +7
includerà 8 giorni ma non 7,5 giorni. Vedi man find
per i dettagli.