我正在编写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[@]}"
${files[*]}
tar
该命令生成的所有文件和目录find /var/log/ -mtime +7都将包含在tar文件中。要仅包括文件,不包括目录,请参见天网的答案。
find /var/log/ -mtime +7
仅需更改一个字符:
#!/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将数字参数解释如下:
find
可以将数字参数指定为 + n表示大于n, -n表示小于n, n表示恰好为n。
因此,-mtime +7意味着年龄大于7天,而-mtime -7意味着小于7天。请注意,find将忽略小数部分。因此+7将包括8天,但不包括7.5天。有关man find详细信息,请参见。
-mtime +7
-mtime -7
+7
man find