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.