如何使用linux shell脚本为超过7天的文件创建tar

Pal*_*mar 8 linux shell

我正在编写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
Run Code Online (Sandbox Code Playgroud)

Joh*_*024 14

这将有效:

#!/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[@]}"
Run Code Online (Sandbox Code Playgroud)

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

有关用于创建files阵列的循环的详细说明,请参阅:如何在Bash中将find命令结果存储为数组

该命令生成的所有文件和目录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[@]}"
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为find解释数字参数如下:

数值参数可以指定为
+ n表示大于n,
-n表示小于n,
n表示正好n.

因此,-mtime +7意味着大于7天,同时-mtime -7意味着小于7.注意,find将忽略小数部分.因此+7将包括8天但不是7.5天.详情man find请见.