如何使用 linux shell 脚本为超过 7 天的文件创建 tar
How to create tar for files older than 7 days using linux shell scripting
我正在编写 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
用这个替换你的 find
命令并重试,
find /var/log -type f -mtime +7
这会起作用:
#!/bin/bash
files=()
while IFS= read -r -d $'[=10=]'; 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
文件中。要仅包含文件而不包含目录,请参阅 Skynet 的回答。
归档最近 7 天的日志
只有一个字符需要更改:
#!/bin/bash
files=()
while IFS= read -r -d $'[=11=]'; do
files+=("$REPLY")
done < <(find /var/log/ -mtime -7 -print0)
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
。
晚会有点晚了,但在寻找类似的解决方案时,我发现这条简单的代码行很好用:
find /var/log -mtime +7 | xargs tar -zcvf archive.tar.gz
使用 xargs
允许 find
的输出进入存档。
我正在编写 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
用这个替换你的 find
命令并重试,
find /var/log -type f -mtime +7
这会起作用:
#!/bin/bash
files=()
while IFS= read -r -d $'[=10=]'; 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
文件中。要仅包含文件而不包含目录,请参阅 Skynet 的回答。
归档最近 7 天的日志
只有一个字符需要更改:
#!/bin/bash
files=()
while IFS= read -r -d $'[=11=]'; do
files+=("$REPLY")
done < <(find /var/log/ -mtime -7 -print0)
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
。
晚会有点晚了,但在寻找类似的解决方案时,我发现这条简单的代码行很好用:
find /var/log -mtime +7 | xargs tar -zcvf archive.tar.gz
使用 xargs
允许 find
的输出进入存档。