幫一上海朋友工廠維護一台freebsd伺服器,該伺服器上運作着squid等服務。伺服器上有一支perl程式會每天定時的切割當天的squid日志,以日期形式儲存在某目錄下,大體如下:
-rw-r--r-- 1 root wheel 51827130 Aug 20 04:27 20110801.log
-rw-r--r-- 1 root wheel 56598624 Aug 20 04:27 20110802.log
-rw-r--r-- 1 root wheel 66925544 Aug 20 04:27 20110803.log
-rw-r--r-- 1 root wheel 47917440 Aug 20 04:27 20110804.log
-rw-r--r-- 1 root wheel 44134286 Aug 20 04:27 20110805.log
-rw-r--r-- 1 root wheel 43705704 Aug 20 04:27 20110808.log
-rw-r--r-- 1 root wheel 33358662 Aug 20 04:27 20110809.log
-rw-r--r-- 1 root wheel 35820354 Aug 20 04:27 20110810.log
-rw-r--r-- 1 root wheel 48065784 Aug 20 04:27 20110811.log
-rw-r--r-- 1 root wheel 38021175 Aug 20 04:27 20110812.log
-rw-r--r-- 1 root wheel 30382856 Aug 20 04:27 20110813.log
-rw-r--r-- 1 root wheel 11898255 Aug 20 04:27 20110815.log
-rw-r--r-- 1 root wheel 10068232 Aug 20 04:27 20110816.log
-rw-r--r-- 1 root wheel 12431556 Aug 20 04:27 20110817.log
-rw-r--r-- 1 root wheel 6405197 Aug 20 04:27 20110818.log
-rw-r--r-- 1 root wheel 5054207 Aug 20 04:27 20110819.log
-rw-r--r-- 1 root wheel 3455222 Aug 26 04:14 20110821.log
-rw-r--r-- 1 root wheel 124680376 Aug 26 04:14 20110822.log
-rw-r--r-- 1 root wheel 150105140 Aug 26 04:14 20110823.log
-rw-r--r-- 1 root wheel 5183330 Aug 26 04:14 20110824.log
-rw-r--r-- 1 root wheel 6486877 Aug 26 04:14 20110825.log
-rw-r--r-- 1 root wheel 8481735 Sep 2 04:03 20110828.log
-rw-r--r-- 1 root wheel 22789068 Sep 2 04:03 20110829.log
-rw-r--r-- 1 root wheel 68841800 Sep 2 04:03 20110830.log
要求:編寫一腳本程式,對該目錄中日志以年月的形式進行歸檔,如201108.tar.gz
代碼如下:
#!/usr/bin/perl -w
use strict;
use Shell qw/mv/;
use File::Path qw/remove_tree/; //調用該子產品的目的是為了删除歸檔前的非空目錄
my %log;
if ( $< != 0 ) {
printf "%s","You must run this script as root\n";
}
opendir LOG,'/data/squid_log' or die "$!\n";
while ( my $file = readdir LOG ) {
chomp $file;
next unless $file =~ /^(\d{6})\d+/;
push @{$log{$1}},$file;
closedir LOG;
for my $str ( sort keys %log ) {
my @array = @{$log{$str}};
mkdir $str,0755;
my $sh = Shell->new();
$sh->mv("@array $str");
system("tar czvf ${str}.tar.gz $str");
remove_tree("$str",{ verbose => 1,});
歸檔過程:
a 201102
a 201102/20110213.log
a 201102/20110214.log
a 201102/20110218.log
a 201102/20110220.log
a 201102/20110221.log
a 201102/20110222.log
a 201102/20110223.log
a 201102/20110224.log
a 201102/20110225.log
a 201102/20110228.log
unlink 201102/20110213.log
unlink 201102/20110214.log
unlink 201102/20110218.log
unlink 201102/20110220.log
unlink 201102/20110221.log
unlink 201102/20110222.log
unlink 201102/20110223.log
unlink 201102/20110224.log
unlink 201102/20110225.log
unlink 201102/20110228.log
rmdir 201102
……………………………………………………………………
最後歸檔後的效果:
[/data/squid_log]# ll
total 203762
-rw-r--r-- 1 root wheel 12817056 Sep 16 20:49 201012.tar.gz
-rw-r--r-- 1 root wheel 8170954 Sep 16 20:49 201101.tar.gz
-rw-r--r-- 1 root wheel 8819026 Sep 16 20:49 201102.tar.gz
-rw-r--r-- 1 root wheel 15008666 Sep 16 20:49 201104.tar.gz
-rw-r--r-- 1 root wheel 10950252 Sep 16 20:49 201105.tar.gz
-rw-r--r-- 1 root wheel 70723508 Sep 16 20:50 201106.tar.gz
-rw-r--r-- 1 root wheel 13035446 Sep 16 20:50 201107.tar.gz
-rw-r--r-- 1 root wheel 63533990 Sep 16 20:51 201108.tar.gz
-rw-r--r-- 1 root wheel 5290849 Sep 16 20:51 201109.tar.gz
-rwx------ 1 root wheel 646 Sep 16 17:30 log.pl
本文轉自dongfang_09859 51CTO部落格,原文連結:http://blog.51cto.com/hellosa/666737,如需轉載請自行聯系原作者