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