2016-07-28 7 views
0

Ich arbeite an einer Windows-Maschine und ich habe ein Verzeichnis mit ~ 200k Dateien gefüllt, die ich organisieren muss. Dies ist ein Job, den ich regelmäßig mit verschiedenen Dateinamensets machen muss, aber mit ähnlichen Mustern, so dass Perl ein gutes Tool zu sein scheint.Dateiorganisation in Windows mit Perl

Jeder Dateiname aus {einem String A} gemacht wird {2 oder 3-stellige Nummer B} {einzelne Buchstaben "r" oder "x"} {3-stellige Nummer} .extension

Ich mag ein erstellen Ordner für jede Saite A

in jedem Ordner möchte ich einen Unterordner für jedes B

ich möchte dann jede Datei in die entsprechenden Unterordner verschieben

So wird es am Ende aussehen so etwas wie

/CustomerA/1 
/CustomerA/2 
/CustomerA/3 
/CustomerB/1 
/CustomerB/2 
/CustomerB/3 

etc mit den Dateien in jedem Unterordner

so CustomerA888x123.xml in bewegt wird/CustomerA/888/

ich die Liste der Dateien in einem Array haben, aber ich habe Schwierigkeiten mit der Aufspaltung Dateiname zu seinen Bestandteilen und verwenden Sie die Teile effektiv.

Danke für die Antwort. Ich landete mit auf den Punkt:

#!usr/bin/perl 
use warnings; 
use strict; 
use File::Copy qw(move); 
use File::Path qw(make_path); 

opendir my $dir, "."; 
my @files = readdir($dir); 
closedir $dir; 

foreach my $file (@files) { 
    my ($cust, $num) = $file =~ m/(\D+)(\d+)/; 
    my $dirname = "$cust/$num"; 
    my @dirs_made = make_path($dirname, { verbose => 1 }); 
    move($file, $dirname) or warn "cant move $file to $dirname: $!"; 
} 
+2

Sie müssen das Programm, das Sie ausprobiert haben, zeigen, bevor wir Ihnen helfen können, es zu beheben – Borodin

+0

Ich habe den Code in Ihrer Frage bearbeitet, um einige Einrückungen und Leerzeilen zur besseren Lesbarkeit hinzuzufügen. Wenn Ihnen das nicht gefällt, rollen Sie es bitte zurück - klicken Sie auf "_edited ..._" (über dem Benutzernamen) und dann auf "_rollback_" unter der vorherigen Version. – zdim

+0

das ist toll, danke. Es gibt Leerzeilen und eine größere Einrückung in dem Code, den ich geschrieben habe, aber als ich es als Kommentar eingefügt habe, ist die Formatierung ein bisschen birnenförmig geworden, also habe ich leere Zeilen gelöscht, weil ich dachte, dass das die Formatierungsprobleme verursacht. Nochmals vielen Dank. – Steve

Antwort

3

Ihrer Beschreibung von Dateinamen gegeben, sollte diese Regex analysieren, was Sie

my ($cust, $num) = $filename =~ m/(\D+)(\d+)/; 

Verwenden Sie eine präzisere Muster benötigen, wenn Sie wollen oder müssen genauer sein über das, was vor der Nummer, zum Beispiel [a-zA-Z] nur für Buchstaben.

, die mit auf der Hand, können Sie Verzeichnisse mit dem Kernmodul File::Path zum Beispiel

use File::Path qw(make_path); 
my $dirname = "$cust/$num"; 
my @dirs_made = make_path($dirname, { verbose => 1 }); 

Dies schafft den Weg schaffen je nach Bedarf, die Namen der erstellten Verzeichnisse zurück. Es druckt auch die Namen mit der verbose. Wenn das Verzeichnis existiert, überspringt es es leise. Wenn es Probleme gibt es wirft ein die so können Sie ihn wickeln wollen in eval

eval { make_path($dirname) }; 
if ([email protected]) { 
    warn "Error with make_path($dirname): [email protected]"; 
} 

Beachten Sie auch die File::Path::Tiny Modul als Alternative dank Sinan Ünür dafür Erziehung. Anders als viel leichter zu sein, es hat auch die häufige Fehlerbehandlungspolitik, wodurch ein falsche bei einem Fehler zurückgegeben wird, so dass Sie eine eval nicht brauchen, sondern nur die übliche Check

use File::Path::Tiny; 
File::Path::Tiny::mk($path) or warn "Can't mk($path): $!"; 

Das Modul verhält sich ähnlich wie mkdir in viele Möglichkeiten, siehe die verlinkte Dokumentation.

die Dateien verschieben die move Funktion bildet das Kernmodul File::Copy, beispielsweise mit

use File::Copy qw(move); 
move($file, $dirname) or warn "Can't move $file to $dirname: $!"; 

All dies in einer Schleife über das Array mit den Dateinamen sein.

+0

Fällt 'make_path' wirklich bei einem Fehler? – Borodin

+0

@Borodin Ja, ich glaube schon. Ich habe es immer "eval", und ich habe jetzt cmdline ausprobiert. – zdim

+0

Was war die Ursache für einen Fehler? – Borodin

Verwandte Themen