我创建了一个用于存档日志文件的Bash脚本:
#!/bin/bash
# Pour chaque dossiers "log" trouvé.
for folder in $(find . -name log -type d )
do :
# Pour chaque dossier log contenant des fichiers ".log" vieux de +30jours.
for file in $(find $folder -name "*.log" -mtime +30)
do :
# Archiver les fichiers ".log".
tar czf archive-log.tar.gz $folder/*.log
done
# Si une archive existe.
if [ -e $folder/*.tar.gz ]
# Déplacer l'archive.
then mv $folder/*.tar.gz $ARCHIVE
fi
done
我的经验输出是:
[logs]$ ll
total 8
drwxr-xr-x 2 webadm webgrp 4096 sep 17 14:26 log_weblogic
-rwxr--r-- 1 webadm webgrp 456 sep 17 14:31 scriptArchivesLog
[log_weblogic]$ ll
total 200
-rw-r----- 1 webadm webgrp 98005 mai 16 04:04 test.log
-rw-r----- 1 webadm webgrp 98005 sep 13 15:29 WLS-CONSOLE-DOMAINE-PUB.log
[logs]$ ll
total 32
-rw-r--r-- 1 webadm webgrp 21734 sep 17 14:31 archive-log.tar.gz
drwxr-xr-x 2 webadm webgrp 4096 sep 17 14:26 log_weblogic
-rwxr--r-- 1 webadm webgrp 456 sep 17 14:31 scriptArchivesLog
当我执行我的脚本时,为什么我的档案中包含所有文件?我只想要符合mtime +30
[logs]$ tar tvzf archive-log.tar.gz
-rw-r----- webadm/webgrp 98005 2013-05-16 04:04:00 ./log_weblogic/test.log
-rw-r----- webadm/webgrp 98005 2013-09-13 15:29:03 ./log_weblogic/WLS-CONSOLE-DOMAINE-PUB.log
答案 0 :(得分:9)
您已经犯了一个严重的错误,即没有检查是否已经有一个程序或库已经做了你想要的。在这种情况下,logrotate可能已存在于您的系统中,并在/ var / log中努力清理系统日志文件。作为奖励,它也将被配置为定期运行,因此您甚至不必记住设置cron作业。
有一个关于在https://www.linode.com/docs/uptime/logs/use-logrotate-to-manage-log-files
使用logrotate的教程答案 1 :(得分:2)
替换以下内容:
for file in $(find $folder -name "*.log" -mtime +30)
do :
# Archiver les fichiers ".log".
tar czf archive-log.tar.gz $folder/*.log
done
与
tar czf archive-log.tar.gz $(find $folder -name "*.log" -mtime +30)
答案 2 :(得分:1)
这是因为你的tar命令:
tar czf archive-log.tar.gz $folder/*.log
实际上存档了所有*.log
文件,而不管这些文件的时间戳如何。
gnu-tar
有一个开关:
--newer-mtime=date
对于这个用例。
答案 3 :(得分:0)
试试这个:
for folder in $(find . -name log -type d ) # Pour chaque dossiers "log" trouvé.
do :
for file in $(find $folder -name "*.log" -mtime +30) # Pour chaque dossier log contenant des fichiers ".log" vieux de +30jours.
do :
tar czf archive-log.tar.gz $folder/*.log && rm -f $folder/*.log # Archiver les fichiers ".log". and remove the copy
done
if [ -e $folder/*.tar.gz ] # Si une archive existe.
then mv $folder/*.tar.gz $ARCHIVE # Déplacer l'archive.
fi
done
答案 4 :(得分:0)
这是错误的部分:
for file in $(find $folder -name "*.log" -mtime +30) # Pour chaque dossier log contenant des fichiers ".log" vieux de +30jours.
do :
tar czf archive-log.tar.gz $folder/*.log # Archiver les fichiers ".log".
done
尽管搜索文件,tar czf archive-log.tar.gz $folder/*.log
仍然会归档所有这些文件。
您可以将其改为:
readarray -t files < <(exec find $folder -name "*.log" -mtime +30) ## read those files (list) to array
[[ ${#files[@]} -gt 0 ]] && tar czf archive-log.tar.gz "${files[@]}" ## create an archive if a file was found.