【问题标题】:Perl script for housekeeping用于家务的 Perl 脚本
【发布时间】:2014-11-24 08:33:23
【问题描述】:

我正在尝试构建一个 perl 脚本来管理 Windows 服务器,但它变得非常困难。所以如果你们能帮助我了解一下。

所以...这个程序应该找到 PDF 文件,将它们压缩,然后删除大于 1mb 的文件(在 zip 文件之外)。

我认为问题在于 IF 文件大小条件。因此,当我将 2 个 PDF 文件放入一个目录(一个小于 1mb,另一个大于 1mb)时,无论我更改了多少次代码,这都是结果:

  1. 压缩所有文件,删除 pdf 文件(不是 zip 文件中的文件)。
  2. 压缩所有文件,删除较大的文件(不是压缩文件中的文件)。
  3. 压缩较大的文件,删除 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。

标签: perl pdf


【解决方案1】:

不清楚 output.zip 如何与 $backup_root 中的文件连接,但我认为概念上的错误是在 find 回调(=inside loop)中重新创建 zip 文件。

试试下面的代码:

#!/usr/bin/perl

# purge backups older than AGE in days

use strict;
use warnings;

use File::Find;
use lib qw(/st/APPL/PORTABLE/Perl/5.8.8);
use IO::Compress::Zip qw(zip $ZipError);
use File::stat;

my $backup_root = "D:/st/APPL/PORTABLE/Perl/bin/teste";

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

# get list of all files and directories in @find_dirs
find( sub { push @file_list, $File::Find::name; }, @find_dirs );

# zip all pdfs found in $backup_root directory
my @found_pdfs = grep{/\.pdf$/} grep {-f} @file_list;
zip \@found_pdfs => 'output.zip' or die "zip failed: $ZipError\n";

# unlink old big files in $backup_root directory
unlink $_ for grep {$now - stat($_)->mtime > $AGE } grep {-s >= 1105593} grep {-f} @file_list;

【讨论】:

  • 我试过没有用。这是输出:zip 失败:空数组引用。
  • pdf 文件是否位于应创建目标 zip 文件的同一目录中?
  • 我已将代码更改为在 $backup_root 目录中压缩 pdf 文件。
猜你喜欢
  • 2014-07-02
  • 2015-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-27
  • 1970-01-01
  • 2016-03-20
  • 1970-01-01
相关资源
最近更新 更多