【发布时间】:2014-11-24 08:33:23
【问题描述】:
我正在尝试构建一个 perl 脚本来管理 Windows 服务器,但它变得非常困难。所以如果你们能帮助我了解一下。
所以...这个程序应该找到 PDF 文件,将它们压缩,然后删除大于 1mb 的文件(在 zip 文件之外)。
我认为问题在于 IF 文件大小条件。因此,当我将 2 个 PDF 文件放入一个目录(一个小于 1mb,另一个大于 1mb)时,无论我更改了多少次代码,这都是结果:
- 压缩所有文件,删除 pdf 文件(不是 zip 文件中的文件)。
- 压缩所有文件,删除较大的文件(不是压缩文件中的文件)。
- 压缩较大的文件,删除 pdf 文件(不是 zip 文件中的文件)。
这是我的代码:
#!/usr/bin/perl
#1 megabyte = 1000000 bytes
use File::Find;
use lib qw(/st/APPL/PORTABLE/Perl/5.8.8);
use MIME::Lite;
use Strict;
use warnings;
use Win32::DriveInfo;
use Archive::Zip;
use Switch;
use IO::Compress::Zip qw(zip $ZipError);
use File::stat;
#my $backup_root = "/path/to/folder"
my $backup_root = "D:/st/APPL/PORTABLE/Perl/bin/teste";
# purge backups older than AGE in days
my @file_list;
my @find_dirs = ($backup_root); # directories to search
my $now = time(); # get current time
my $days = 31; # how many days old
my $seconds_per_day = 60 * 60 * 24; # seconds in a day
my $AGE = $days * $seconds_per_day; # age in seconds
find(
sub {
my $file = $File::Find::name;
my $filesize = stat($file)->size;
if ( -f $file ) {
push( @file_list, $file );
print "Ficheiro $file encontrado!\n";
print "Size: $filesize\n";
}
if ( $filesize >= 1105593 ) {
#my @files = <*20131221*.pdf>;
my @files = <*.pdf>;
zip \@files => 'output.zip'
or die "zip failed: $ZipError\n";
for my $file (@file_list) {
my @stats = stat($file);
if ( $now - $stats[9] > $AGE ) {
unlink $file;
}
}
print "Deleted files older than $days days.\n";
} elsif ( $filesize <= 1105593 ) {
print "O ficheiro e mais pequeno que 1 mb !";
}
},
@find_dirs
);
【问题讨论】:
-
您的目标是通过压缩 PDF 来节省空间吗?只是他们通常有内部压缩,不会进一步压缩。
-
是的。但重点是通过创建计划任务来自动化压缩文件,因为该服务每天会生成许多 PDF 文件,有些较大有些较小。
-
我认为 $File::Find::name 保存了当前找到的文件的名称,所以 $filesize 保存了当前文件的大小。为什么要在“if ($filesize >= 1105593)”块内通配“”?当当前文件是目录而不是常规文件时,应该进行 globbing 和 zipping,不是吗?该代码当前每次找到大于 1MB 的文件时都会压缩 pdf。