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.