我正在编写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 <
tar cvfz backup.tar.gz"${files[@]}"
请注意,使用"${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 <
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。
谢谢约翰。 它的工作。 太棒了:)
刚才注意到它不断循环。 迭代不会停止。 我在这里做错什么了吗?
@Palanikumar我的版本没有循环也没有迭代,只有两个命令。 一个定义文件列表,另一个定义文件的tar。 所以,请告诉我您所看到的。 如果不确定发生了什么,请将set -x放在脚本的开头。
如果仍然收到错误,请尝试修改IFS:#保存并更改IFS OLDIFS = $ IFS IFS = $ n#将所有文件名读入数组fileArray =($(find $ DIR -type f))#恢复它 IFS = $ OLDIFS在cyberciti.biz/tips/handling-filenames-with-spaces-in-bash.html中找到了解决方案
以此替换您的find命令,然后重试,
find /var/log -type f -mtime +7
-7但答案为+1 :)
最后7天进入zip文件:```找到/ yourpath /-类型f -mtime -7 -print | zip dump.zip-@```