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

时间:2015-01-28 05:06:58

标签: 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

2 个答案:

答案 0 :(得分: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[@]}"将扩展为每个文件名提供一个参数tar,即使文件名包含空格,制表符或换行符,也会有效。相比之下,在shell扩展${files[*]}之后,它将执行分词,可能会破坏您的文件名。

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

命令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

答案 1 :(得分:3)

用此替换find命令,然后重试,

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