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

How to create tar for files older than 7 days using linux shell scripting

我正在编写 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

用这个替换你的 find 命令并重试,

find /var/log -type f -mtime +7 

这会起作用:

#!/bin/bash
files=()
while IFS=  read -r -d $'[=10=]'; do
    files+=("$REPLY")
done < <(find /var/log/ -mtime +7 -print0)
tar cvfz backup.tar.gz "${files[@]}"

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

有关用于创建 files 数组的循环的详细说明,请参阅:How can I store find command result as arrays in Bash

命令 find /var/log/ -mtime +7 生成的所有文件和目录都将包含在 tar 文件中。要仅包含文件而不包含目录,请参阅 Skynet 的回答。

归档最近 7 天的日志

只有一个字符需要更改:

#!/bin/bash
files=()
while IFS=  read -r -d $'[=11=]'; do
    files+=("$REPLY")
done < <(find /var/log/ -mtime -7 -print0)
tar cvfz backup.tar.gz "${files[@]}"

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

Numeric arguments can be specified as
+n for greater than n,
-n for less than n,
n for exactly n.

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

晚会有点晚了,但在寻找类似的解决方案时,我发现这条简单的代码行很好用:

find /var/log -mtime +7 | xargs tar -zcvf archive.tar.gz

使用 xargs 允许 find 的输出进入存档。