【问题标题】:Code that finds missing files in a series查找系列中丢失文件的代码
【发布时间】:2010-07-18 05:23:23
【问题描述】:

我正在寻找能够识别一系列文件中丢失的文件并将该列表导出到 txt 文件的代码行。例如:名为 1to100000 的目录包含名为 1,2...99999,100000 的 pdf,但该系列中缺少一些。我希望脚本将那些丢失的文件报告到 txt 文件中。理想情况下,这将是一个可执行的 perl 脚本。 谢谢, 杰克

【问题讨论】:

  • 请说的更清楚些。当您说“名为 1to100000 的目录包含名为 1,2...99999,100000 的 pdf 文件”时,这些是 PDF 文件吗?什么定义了系列?系列是仅由文件名定义还是PDF文件需要解析?更好的问题产生更好的答案...
  • 整数。该系列是一组pdf文件。目录名称并不真正相关。有一个文件夹包含文件 x 到 x+10000,这些约束很容易定义。如果我想知道这个连续系列中缺少哪些文件,我该怎么做?

标签: perl scripting series


【解决方案1】:

只需从 1 数到 100000 并检查文件是否存在。

foreach my $num ( 1 .. 100000 ) { 
    my $fname = "1to100000/$num.pdf";
    print "missing $fname\n" unless -f $fname;
}

【讨论】:

  • 我想你会发现 100000 个统计数据会比 100000 个 readdirs 慢很多。
【解决方案2】:

使用 readdir:

my @expect = map "$_.pdf", 1..100000;
my %notfound;
@notfound{@expect} = ();

opendir my $dirh, "1to100000" or die "Couldn't open directory: $!";
while ( my $fname = readdir($dirh) ) {
    delete $notfound{$fname};
}

for my $fname (@expect) {
    if ( exists $notfound{$fname} ) {
        print "missing $fname\n";
    }
}

【讨论】:

    【解决方案3】:

    这是一个查找范围内缺失数字的示例(使用 Set::IntSpan)。

    #!/usr/bin/perl
    use strict;
    use warnings;
    
    use Set::IntSpan;
    
    # the last sector on disk
    my $end_sect = 71127179;
    
    # The complete range of sectors on the disk
    my $range = Set::IntSpan->new( "0-$end_sect" );
    
    # The ranges of used sectors
    my $used = Set::IntSpan->new( 
    '0-1048706,1048707-2097414,69078879-71127179' );
    
    # Calculates the remaining unused sectors
    my $unused = $range->diff( $used );
    
    print $unused->run_list;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-22
      • 1970-01-01
      • 2012-04-19
      相关资源
      最近更新 更多