我正在尝试编写一个 Unix 脚本,该脚本将转到特定目录并 tar.gz 所有超过 2 天的日志文件。到目前为止我已经有了这个,但它不起作用。任何帮助,将不胜感激。
#!/bin/bash
AGE_TO_COMPRESS="2419200" # 172800 seconds = 2 days
LOG_FILES="/myfile/logs"
for file in $LOG_FILES;
do
if [ $(( `date +%s`)) -gt ${AGE_TO_COMPRESS} ]
then
tar -cvzf $file.tar.gz $file;
fi
fi
done
答案1
我纠正了你的脚本中最明显的错误。我认为它将LOG_FILES
包含要压缩的文件列表。
#!/bin/bash
AGE_TO_COMPRESS=2419200 # 28 days
# list of file to compress
LOG_FILES="/tmp/test/test /tmp/test/test2 /tmp/test/test3 /tmp/test/test4"
# Any file older than EDGE_DATE must be compressed
NOW=$( date +%s )
EDGE_DATE=$(( NOW - AGE_TO_COMPRESS ))
for file in $LOG_FILES ; do
# check if file exists
if [ -e "$file" ] ; then
# compare "modified date" of file to EDGE_DATE
if [ $( stat -c %Y "$file" ) -lt ${EDGE_DATE} ] ; then
# create tar file of a single file
# this is an odd way to compress a file
tar -cvzf $file.tar.gz $file
# do we want to delete the old file?
# rm "$file"
fi
fi
done
无论如何,我同意@dhag 的观点,即find
/bzip2
解决方案会更好。
你考虑过使用吗logrotate
?既然有专用软件,为什么还要重写轮子呢?
答案2
该命令find -type f -mtime +2
将查找超过两天的文件。然后你可以使用 find 的选项-exec
来压缩它们;也许是这样的:
find -type f -mtime +2 -exec gzip {} +
如果您了解有关该文件的额外信息,也许它们的名称都以 结尾.log
,那么将其添加到您的过滤器 ( ) 可能是明智的-name '*.log'
。