我正在编写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
Run Code Online (Sandbox Code Playgroud)
Joh*_*024 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[@]}"
Run Code Online (Sandbox Code Playgroud)
注意使用"${files[@]}"
相反${files[*]}
. "${files[@]}"
将扩展为tar
每个文件名提供一个参数,即使文件名包含空格,制表符或换行符也可以使用.相比之下,在shell扩展之后${files[*]}
,它将执行分词,可能会破坏您的文件名.
有关用于创建files
阵列的循环的详细说明,请参阅:如何在Bash中将find命令结果存储为数组
该命令生成的所有文件和目录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[@]}"
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为find
解释数字参数如下:
数值参数可以指定为
+ n表示大于n,
-n表示小于n,
n表示正好n.
因此,-mtime +7
意味着大于7天,同时-mtime -7
意味着小于7.注意,find
将忽略小数部分.因此+7
将包括8天但不是7.5天.详情man find
请见.