我正在编写一个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[@]}"
将会为每个文件名提供一个参数,即使文件名包含空格、制表符或换行符,也能正常工作。相比之下,在shell扩展${files[*]}
后,它将执行单词拆分,可能会破坏您的文件名。
有关用于创建files
数组的循环的详细说明,请参见:如何在Bash中将find命令结果存储为数组
由命令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
将数字参数解释如下:
可以指定数字参数如下:
+n 表示大于 n,
-n 表示小于 n,
n 表示恰好等于 n。
因此,-mtime +7
表示大于7天,而-mtime -7
表示小于7天。请注意,find
将忽略小数部分。因此,+7
将包括8天但不包括7.5天。有关详细信息,请参见man find
。
使用以下命令替换您的find
命令,然后再次尝试:
find /var/log -type f -mtime +7
find /yourpath/ -type f -mtime -7 -print | zip dump.zip -@
- Yarofind /var/log -mtime +7 | xargs tar -zcvf archive.tar.gz
使用 xargs
允许 find
的输出进入归档。
set -x
。 - John1024保存并更改IFS
OLDIFS=$ IFS IFS=$'\ n'将所有文件名读入数组中
fileArray = $((find $ DIR-type f))恢复它
IFS = $ OLDIFS在http://www.cyberciti.biz/tips/handling-filenames-with-spaces-in-bash.html上找到解决方案 - sho