Schleife über alle Dateien eines Verzeichnisses

Hallo,
hatte bei einem Bash-Script das Problem, dass bei einer Schleife über alle Dateien eines Ordners (sagen wir mal 500 csv-Dateien) unregelmäßig Dateien übersprungen wurden. Habe mich dann in perl eingelesen und ein neues Script geschrieben -> Gleiches Ergebnis (wenn auch seltener)!!!
In meinen Augen unerklärlich… Hatte jemand schonmal ein vergleichbares Problem?

Meine Schleife:
opendir(DIR, „$pfad“) or die „Could not opendir to $pfad: $!\n“;
while (defined (my $csv = glob(’*.csv’))){

}

Gruß,
Marc

Hallo,

hatte bei einem Bash-Script das Problem, dass bei einer
Schleife über alle Dateien eines Ordners (sagen wir mal 500
csv-Dateien) unregelmäßig Dateien übersprungen wurden. Habe
mich dann in perl eingelesen und ein neues Script geschrieben
-> Gleiches Ergebnis (wenn auch seltener)!!!

Wurden waehrend des Durchlaufs Dateien geloescht oder hinzugefuegt?

In meinen Augen unerklärlich… Hatte jemand schonmal ein
vergleichbares Problem?

Bisher nicht.

Meine Schleife:
opendir(DIR, „$pfad“) or die „Could not opendir to $pfad:
$!\n“;

Fuer glob() brauchst du das opendir nicht, nur wenn du spaeter mit readdir lesen willst.

while (defined (my $csv = glob(’*.csv’))){

}

Du kannst auch mal probieren

for my $csv (glob '\*.csv') { ... }

Damit werden denn alle Dateinamen auf einmal eingelesen, und erst danach darueber iteriert - vielleicht bringts ja was.

Gruesse,
Moritz

Hallo Moritz,
schonmal danke für die schnelle Antwort!

Zu deinen Fragen/Kommentaren der Reihe nach:

Während jeden Durchlaufs kommen 4 Dateien hinzu, 1 davon durch einen OS-Befehl (gnuplot), 2 davon werden gleich wieder gelöscht.

Werde das opendir/closedir dann mal weglassen, und deinen alternativen Vorschlag bzgl. der Schleife probieren!

Danke,
Marc

Hallo,

Meine Schleife:
opendir(DIR, „$pfad“) or die „Could not opendir to $pfad:
$!\n“;
while (defined (my $csv = glob(’*.csv’))){

}

Das glob()/opendir()-Problem hat Moritz schon
erklärt, allerdings – versuch doch mal eine
‚kanonischere‘ Art des Verzeichnislesens:

 ...

 my $pfad = '/xx/yy/zz';

 opendir my $dh, $pfad or die "$pfad geht nicht, $!";
 my @filenames = grep /\.csv$/, readdir $dh;
 closedir $dh;

 for my $fn (@filenames ) {
 ...
 # tuwas mit $fn
 ...
 }

 ...

Grüße

CMБ

Hallo,
möchte euch beiden danken!
Der ‚kanonische Ansatz‘ führte ebenfalls zu übersprungenen Dateien.
Die einfache Schleife
for my $csv (glob ‚*.csv‘) {

}
hat in 4 Durchgängen fehlerfrei funktioniert. Vielleicht bleibt es ja dabei…
Hätte vielleicht noch erwähnen sollen, dass das Verzeichnis eine Freigabe von einem Windows 2000 Rechner ist. Dieser und auch der Linux-Server sind virtuelle Maschinen (VMWare ESX).
Wenn das Problem bestehen bleibt, versuche ich die Arbeit in einem temporären Ordner auf dem Linux-Server zu machen und die Dateien nachher zu verschieben.

Hallo,

möchte euch beiden danken!
Der ‚kanonische Ansatz‘ führte ebenfalls zu übersprungenen
Dateien.

Hmmm, wäre mir neu. In Perl 5.10 gibt es sogar
einen Test, der das ausschliesst:

[/perl-5.10.0/ext/File/Glob/t/basic.t]

 ...

 # look for the contents of the current directory
 $ENV{PATH} = "/bin";
 delete @ENV{BASH\_ENV, CDPATH, ENV, IFS};
 @correct = ();

 if (opendir(D, $^O eq "MacOS" ? ":" : ".")) {
 @correct = grep { !/^\./ } sort readdir(D);
 closedir D;
 }

 @a = File::Glob::glob("\*", 0);
 @a = sort @a;

 if ("@a" ne "@correct" || GLOB\_ERROR) {
 print "# |@a| ne |@correct|\nnot ";
 }
 print "ok 2\n";

Die einfache Schleife
for my $csv (glob ‚*.csv‘) {

}
hat in 4 Durchgängen fehlerfrei funktioniert. Vielleicht
bleibt es ja dabei…

glob() benutzt ja intern auch C’s readdir(), sollte
nichts anderes herauskommen, wenn ja, dann liegt
vielleicht noch ein anderes Problem vor.

Hätte vielleicht noch erwähnen sollen, dass das Verzeichnis
eine Freigabe von einem Windows 2000 Rechner ist. Dieser und
auch der Linux-Server sind virtuelle Maschinen (VMWare ESX).
Wenn das Problem bestehen bleibt, versuche ich die Arbeit in
einem temporären Ordner auf dem Linux-Server zu machen und die
Dateien nachher zu verschieben.

Welche Dateien werden denn ausgelassen? Ist das
Win-Verzeichnis ‚cifs‘ oder ‚smbfs‘ gemountet? Mit
welchen Optionen?

Grüße

CMБ

Meine weiteren Kommentare:

Hallo,

möchte euch beiden danken!
Der ‚kanonische Ansatz‘ führte ebenfalls zu übersprungenen
Dateien.

Hmmm, wäre mir neu. In Perl 5.10 gibt es sogar
einen Test, der das ausschliesst:

[/perl-5.10.0/ext/File/Glob/t/basic.t]

look for the contents of the current directory

$ENV{PATH} = „/bin“;
delete @ENV{BASH_ENV, CDPATH, ENV, IFS};
@correct = ();

if (opendir(D, $^O eq „MacOS“ ? „:“ : „.“)) {
@correct = grep { !/^./ } sort readdir(D);
closedir D;
}

@a = File::Glob::glob("*", 0);
@a = sort @a;

if ("@a" ne „@correct“ || GLOB_ERROR) {
print "# |@a| ne |@correct|\nnot ";
}
print „ok 2\n“;

Die einfache Schleife
for my $csv (glob ‚*.csv‘) {

}
hat in 4 Durchgängen fehlerfrei funktioniert. Vielleicht
bleibt es ja dabei…

glob() benutzt ja intern auch C’s readdir(), sollte
nichts anderes herauskommen, wenn ja, dann liegt
vielleicht noch ein anderes Problem vor.

Stimmt! Auch bei der Schleife tauchte das Problem später auf.

Hätte vielleicht noch erwähnen sollen, dass das Verzeichnis
eine Freigabe von einem Windows 2000 Rechner ist. Dieser und
auch der Linux-Server sind virtuelle Maschinen (VMWare ESX).
Wenn das Problem bestehen bleibt, versuche ich die Arbeit in
einem temporären Ordner auf dem Linux-Server zu machen und die
Dateien nachher zu verschieben.

Welche Dateien werden denn ausgelassen? Ist das
Win-Verzeichnis ‚cifs‘ oder ‚smbfs‘ gemountet? Mit
welchen Optionen?

Es werden einige (eigentlich immer unter 10) csv-Dateien von mehreren Hundert ausgelassen. Ich kann keinen Unterschied zu den funktionierenden csv-Dateien feststellen. Schätze aber, dass es da doch irgendwas gibt…
Das Win-Verzeichnis ist als ‚smbfs‘ gemountet, als Optionen habe ich nur username, password, uid und gid an.

Grüße

CMБ

Mittlerweile habe ich aber eine für mich tragbare Lösung gefunden:
Ich hänge einfach eine zweite Schleife an, die checkt, ob zu jeder csv-Datei die Ausgabedateien schon existieren. Wenn nicht, wird halt dasselbe gemacht wie in der ersten Schleife. Bislang wurden die übersprungenen Dateien dann immer in der zweiten Schleife bearbeitet!

Auf jeden Fall vielen Dank für die Hilfe und viele Grüße,

Marc