Schrift
[thread]6918[/thread]

Alle Dateien eines Verzeichnis: Rekursion == Aggression ?



<< >> 8 Einträge, 1 Seite
subsys
 2005-04-21 12:19
#54080 #54080
User since
2005-03-08
27 Artikel
BenutzerIn
[default_avatar]
Erstmal sorry, dass ich euch mit sowas einfachen nerve:
Und zwar möchte ich aus einem Ordner samt Unterordnern alle Dateien bearbeiten. Egal welcher Endung o.ä. :

Code (perl): (dl )
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
sub entpacken
{
 my $datei;
 my $check;
 my $verzeichnis = $_[0];

 opendir(DIR, $verzeichnis);
 while($datei = readdir(DIR))
 {
  if ($datei ne "." && $datei ne "..")
  {
   $check = $verzeichnis .  $datei;
   if (-d $check)
   {
    $check = $check . "\/";
    entpacken($check);
   }
   else
   {
    print $datei . "\n";
    tue_was_mit_datei($datei);   
   }
  }
 }
 closedir(DIR);
}


Leider bricht die Funktion immer nach den ersten 2 Ordnern ab.
Ich nehme mal an, dass die Methode zu umständlich ist. Aber wie geht es einfacher bzw. wie funktioniert es überhaupt ?
renee
 2005-04-21 12:29
#54081 #54081
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Am besten geht es mit CPAN:File::Find:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#! /usr/bin/env perl

use strict;
use warnings;
use File::Find;

my $dir = './testdir';
my @files;
find(\&get_dir,$dir);

for my $file(@files){
tue_was_mit_datei($file);
}

sub get_dir{
push(@files,$File::Find::name) if(-f $File::Find::name);
}# get_dir
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
zipster
 2005-04-21 12:49
#54082 #54082
User since
2004-09-06
458 Artikel
BenutzerIn
[default_avatar]
Jau würde dir auch zu File::Find raten.
Ist zwar ein wenig CPU lastig während der Suche aber liefert ein gutes Ergebniss.
Crian
 2005-04-21 13:10
#54083 #54083
User since
2003-08-04
5872 Artikel
ModeratorIn
[Homepage]
user image
Ansonsten brauchst Du Rekursion.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
esskar
 2005-04-21 13:47
#54084 #54084
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
hab da letztens was geschrieben
Code: (dl )
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
use strict;

package Ox::Util;
use vars '$VERSION';
$VERSION = '0.01';

sub string_trim {
my ($str, $c) = @_;

$c ||= ' ';
$str =~ s!$c+$!!;

return ($str);
}

1;

use strict;

package Ox::File;
use vars '$VERSION';
$VERSION = '0.01';

use Ox::Util ();

sub fix {
my $path = shift || '';

$path =~ s!\\!/!g;
$path =~ s!/+!/!g;

return $path;
}

sub enum {
my %args = @_;

$args{dir} ||= '';
$args{depth} ||= 0;
$args{callback} ||= '';

return 0 unless ref $args{callback} eq 'CODE';
return 0 unless -d $args{dir};

$args{dir} = &fix($args{dir});
$args{dir} = Ox::Util::string_trim($args{dir}, '/');

my $handle;
if(opendir($handle, $args{dir})) {
while(defined(my $entry = readdir $handle)) {
next if $entry =~ /^\.\.?$/;

my $filename = $args{dir}.'/'.$entry;

if(-d $filename and ($args{depth} > 0 or $args{depth} < 0)) {
my %copyofargs = %args;

$copyofargs{dir} = $filename;
$copyofargs{depth}--;

enum(%copyofargs);
}

$args{callback}->($filename) if -f $filename;
}
closedir($handle);
}

return (1);
}

1;


benutzen kannst du es so

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
use strict;
use warnings;

use Ox::File;

&Ox::File::enum(
dir => "C:\\",
depth => -1, # komplett rekursiv
callback => sub {
my ($filename) = @_;
print "$filename\n";
}
);


HTH
subsys
 2005-04-21 15:28
#54085 #54085
User since
2005-03-08
27 Artikel
BenutzerIn
[default_avatar]
[quote=renee,21.04.2005, 10:29]Am besten geht es mit CPAN:File::Find:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#! /usr/bin/env perl

use strict;
use warnings;
use File::Find;

my $dir = './testdir';
my @files;
find(\&get_dir,$dir);

for my $file(@files){
tue_was_mit_datei($file);
}

sub get_dir{
push(@files,$File::Find::name) if(-f $File::Find::name);
}# get_dir
[/quote]
Hat perfekt geklappt. Habe Dank.
Vorkim
 2005-08-12 17:20
#54086 #54086
User since
2003-09-27
50 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
1
2
3
for my $file(@files){
exec "tidy -clean -i -asxhtml -latin1 -m $file";
}



Müsste so ähnlich damit doch auch gehen, oder?
pq
 2005-08-12 19:35
#54087 #54087
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=subsys,21.04.2005, 10:19]Leider bricht die Funktion immer nach den ersten 2 Ordnern ab.[/quote]
deine methode funktioniert nicht, weil du jeweils den globalen filehandle DIR
benutzt. der wird ja jedesmal überschrieben. am besten also einen lexikalischen
filehandle benutzen.

ansonsten bitte nochmal Wiki:use strict lesen, bezüglich "Wo sollten variablen deklariert werden".
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
<< >> 8 Einträge, 1 Seite



View all threads created 2005-04-21 12:19.