一尘不染

如何使用Linux Shell脚本为7天以上的文件创建tar

linux

我正在编写Shell脚本来备份7天以上的文件。这是我的代码。但是我没有得到预期的结果。谁能纠正我?

#!/bin/bash
# Backup files

files=($(find /var/log/ -mtime +"7"))
 for files in ${files[*]}
 do
         echo $files
         tar cvfz backup.tar.gz $files
 done

阅读 347

收藏
2020-06-07

共1个答案

一尘不染

这将起作用:

#!/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[@]}"

注意使用而"${files[@]}"不是${files[*]}
"${files[@]}"将扩展为tar每个文件名提供一个参数,并且即使文件名包含空格,制表符或换行符也可以使用。相比之下,shell扩展后${files[*]},它将执行分词,可能会破坏您的文件名。

该命令生成的所有文件和目录find /var/log/ -mtime +7都将包含在tar文件中。要仅包括文件,不包括目录,请参见天网的答案。

存档最近七天的日志

仅需更改一个字符:

#!/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[@]}"

之所以有效,是因为find将数字参数解释如下:

可以将数字参数指定为
+ n表示大于n,
-n表示小于n,
n表示恰好为n。

因此,-mtime +7意味着年龄大于7天,而-mtime -7意味着小于7天。请注意,find将忽略小数部分。因此+7将包括8天,但不包括7.5天。有关man find详细信息,请参见。

2020-06-07