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

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

最佳答案

这会起作用:

#!/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 文件中。要仅包含文件而不包含目录,请参阅 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 解释数字参数如下:

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

关于linux - 如何使用 linux shell 脚本为超过 7 天的文件创建 tar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28185012/

相关文章:

linux - 在 linux 中删除打开的文件时内部会发生什么

shell - 如何在 shell 脚本中列出每个星期一和星期四的日期?

Bash:如何使用 bash 减去两个时间字符串?

arrays - 如何在 Bash 中按降序对字符串数组进行排序?

linux - ping 的替代方法

linux - "more"支持颜色的命令选项?

linux - 如何在 bash 中间接分配变量以从标准输入、文件和执行输出中获取多行数据

php - 我无法通过PHP使用Powershell脚本制作Word文件

linux - 使用 git pull 和 git push 命令的 origin master 和 origin/master 之间的区别

linux - rndc : error:/etc/bind/rndc. key :5: unknown option 'options' . 。无法加载 rndc 配置