Leser: 21
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
opendir DC, $dir or die "cann't open dir";
my @filenames = sort readdir(DC);
@filenames = reverse(@filenames);
closedir(DC);
foreach my $file (@filenames) {
my($filename, $dirname, $ftype) = fileparse($file, qr/\..*/, qr/\.(txt)/);
#abschneiden buchstabe
if (substr($filename, -1) =~ m/[a-z]/i) {
chop($filename);
}
push (@test, $filename, $file);
}
for my $file(@test) {
my ($root) = split(/\_/,$file);
next if(exists($hash{$root}));
$hash{$root} = $file;
}
my @unique = values(%hash);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
my $dir = '/path/to/dir'; my %files; my @keep; my @to_delete; opendir my $dir_h, $dir or die "Can't open directory $dir: $!"; while ( my $entry = readdir $dir_h ) { # hole den namen und den "counter" my ($name,$counter) =~ $entry =~ m{ (.*?) ([a-z]) \.txt }x; # wenn es keine Datei mit dem Muster ist, mache einfach mit # der nächsten Datei weiter next if !($name and $counter); # speichere den namen und das "zählkürzel" # $files->{TestA002}->{a} = 1 $files{$name}->{$counter} = 1; } closedir $dirh; # laufe über die Namen (z.B. TestA001, TestA002, ...) for my $name ( keys %files ) { # sortiere die "zählkürzel" absteigend. Das "höchste" wird in # $keep gespeichert, der Rest in @delete my ($keep,@delete) = sort{ $b cmp $a }keys %{ $files{$name} }; # setze den Dateinamen wieder zusammen und speichere es in @keep push @keep, "$name$keep.txt"; # für jedes andere Zählkürzel wird der Dateiname zusammengesetzt und # in @to_delete gespeichert. push @to_delete, map{ "$name$_.txt" }@delete; } print "Keep: @keep\nDelete: @to_delete\n";
my ($name,$counter) = $entry =~ m{ (.*?) ([a-z]) \.txt }x;
closedir $dir_h;
1
2
3
4
5
jars@jars-desktop:~/community$ perl list_files.pl
Keep: TestB_001a.txt TestA_002b.txt TestA_001b.txt
Delete: TestA_002a.txt TestA_001a.txt
jars@jars-desktop:~/community$ ls ../community_test/
TestA_001a.txt TestA_001b.txt TestA_002a.txt TestA_002b.txt TestB_001a.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
for my $name ( keys %files ) {
[b]my $stern = '*';[/b]
# sortiere die "zählkürzel" absteigend. Das "höchste" wird in
# $keep gespeichert, der Rest in @delete
my ($keep,@delete) = sort{ $b cmp $a }keys %{ $files{$name} };
# setze den Dateinamen wieder zusammen und speichere es in @keep
push @keep, "$name$keep$stern.txt";
# für jedes andere Zählkürzel wird der Dateiname zusammengesetzt und
# in @to_delete gespeichert.
push @to_delete, map{ "$name$_$stern.txt" }@delete;
}
foreach $file (@to_delete) {
unlink ($file) or die "Can't delete $file - $!";
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
#!/usr/bin/perl use strict; use warnings; my $dir = '/home/jars/community_test/'; my %files; my @keep; my @to_delete; opendir my $dir_h, $dir or die "Can't open directory $dir: $!"; while ( my $entry = readdir $dir_h ) { # hole den namen und den "counter" my ($name,$counter) = $entry =~ m{ (.*?) (\d+) [a-z] \.txt }x; # wenn es keine Datei mit dem Muster ist, mache einfach mit # der nächsten Datei weiter next if !($name and $counter); # speichere den namen und das "zählkürzel" # $files->{TestA_}->{001} = 1 push @{ $files{$name}->{$counter} }, $entry; } closedir $dir_h; # laufe über die Namen (z.B. TestA001, TestA002, ...) for my $name ( keys %files ) { # sortiere die "zählkürzel" absteigend. Das "höchste" wird in # $keep gespeichert, der Rest in @delete my ($keep,@delete) = sort{ $b cmp $a }keys %{ $files{$name} }; # setze den Dateinamen wieder zusammen und speichere es in @keep push @keep, map{ $dir . $_ }@{ $files{$name}->{$keep} }; # für jedes andere Zählkürzel wird der Dateiname zusammengesetzt und # in @to_delete gespeichert. push @to_delete, map{ $dir . $_ }map{ @{ $files{$name}->{$_} } }@delete; } print "Keep: @keep\nDelete: @to_delete\n";