如何使用Linux shell脚本创建超过7天的文件的tar压缩包

10

我正在编写一个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
3个回答

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

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

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

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

归档最近七天的日志

只需要更改一个字符:

#!/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


刚刚注意到它一直在循环。迭代没有停止。我在这里做错了什么吗? - Palanikumar
@Palanikumar 我的版本没有循环和迭代,只有两个命令。一个定义文件列表,另一个将文件打包。所以,请告诉我你看到了什么。如果你不确定正在发生什么,请在脚本开头加上 set -x - John1024
如果您仍然收到错误,请尝试修改IFS:

保存并更改IFS

OLDIFS=$ IFS IFS=$'\ n'

将所有文件名读入数组中

fileArray = $((find $ DIR-type f))

恢复它

IFS = $ OLDIFS在http://www.cyberciti.biz/tips/handling-filenames-with-spaces-in-bash.html上找到解决方案
- sho

4

使用以下命令替换您的find命令,然后再次尝试:

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

1
-7,但答案加1 :) - Yaro
1
将过去7天的文件打包成zip文件:find /yourpath/ -type f -mtime -7 -print | zip dump.zip -@ - Yaro

0
有点晚了,但在寻找类似解决方案时,我发现这个简单的代码行非常有效:
find /var/log -mtime +7 | xargs tar -zcvf archive.tar.gz

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接