2010-07-18 5 views
0

Je recherche une ligne de code qui identifie les fichiers manquants dans une série de fichiers et exporte cette liste dans un fichier txt. Par exemple: un répertoire appelé 1to100000 contient des pdfs nommés 1,2 ... 99999,100000 mais il manque quelques uns de la série. Je voudrais que le script signale ces fichiers manquants dans un fichier txt. Idéalement, ce serait un script Perl exécutable. Merci, JakeCode qui trouve des fichiers manquants dans une série

+0

Veuillez être plus clair. Quand vous dites "un répertoire appelé 1to100000 contient des pdfs nommés 1,2 ... 99999,100000", ce sont des fichiers PDF? Qu'est-ce qui définit la série? La série est-elle définie uniquement par le nom du fichier ou les fichiers PDF doivent-ils être analysés? De meilleures questions produisent de meilleures réponses ... – dawg

+0

Entiers. La série est un ensemble de fichiers pdf. Les noms de répertoires ne sont pas vraiment pertinents. Il y a un dossier contenant les fichiers x à x + 10000 où ces contraintes sont facilement définies. Si je veux savoir quels sont les fichiers manquants dans cette série continue, comment faire? – Jake

Répondre

3

Comptez simplement de 1 à 100 000 et vérifiez si le fichier existe.

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

Je pense que vous trouverez 100000 stats seront sensiblement plus lent que 100000 readdirs. – ysth

3

Utiliser 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"; 
    } 
} 
0

Voici un exemple de trouver les numéros manquants dans une plage (en utilisant 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; 
Questions connexes