Nahraďte find pomocí tohoto příkazu a zkuste to znovu,
find /var/log -type f -mtime +7
Toto bude fungovat:
#!/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[@]}"
Všimněte si použití "${files[@]}" na rozdíl od ${files[*]} . "${files[@]}" se rozšíří na tar s jedním argumentem na název souboru a bude fungovat, i když názvy souborů obsahují mezery, tabulátory nebo nové řádky. Naproti tomu po rozbalení shellu ${files[*]} , provede dělení slov a potenciálně pozmění názvy souborů.
Podrobné vysvětlení smyčky použité k vytvoření files pole, viz:Jak mohu uložit výsledek příkazu find jako pole v Bash
Všechny soubory a adresáře vytvořené příkazem find /var/log/ -mtime +7 bude zahrnuto v tar soubor. Chcete-li zahrnout pouze soubory, nikoli adresáře, viz odpověď Skynetu.
Pro archivaci protokolů ze sedmi posledních dnů
Je třeba změnit pouze jeden znak:
#!/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[@]}"
To funguje, protože find interpretuje číselné argumenty následovně:
Číselné argumenty lze zadat jako
+n pro větší než n,
-n za méně než n,
n přesně n.
Tedy -mtime +7 znamená starší než 7 dní, zatímco -mtime -7 znamená méně než 7. Všimněte si, že find bude ignorovat zlomkové části. Tedy +7 bude zahrnovat 8 dní staré, ale ne 7,5 dne staré. Viz man find pro podrobnosti.