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