2017-02-04 5 views
0

Ich muss mit Perl den Inhalt eines Windows-Verzeichnisses mit Klammern in seinem Namen in einen anderen Ordner verschieben, das Problem ist, dass es immer wegen der Klammer fehlschlägt .perl: mit File :: Copy move() in Windows-Verzeichnisse mit Klammern

Ich habe versucht, entweder glob oder mit opendir + readdir Funktionen, aber ich Fehler immer bekommen, zum Beispiel:

#!/usr/bin/perl 
use File::Copy; 

$src = "c:\\temp (1)J"; 
for $f (glob("$src\*")) { 
    move($f, "\out"); 
} 

, dass auch diese nicht:

#!/usr/bin/perl 
use File::Copy; 

$src = "c:\temp (1)"; 
opendir DIR, $src; 
while ($f = readdir(DIR)) { 
    move("$src\$f", "\out"); 
} 

Irgendwelche Ideen, wie man das löst?

+1

Eigentlich ist es der Raum, der ein spezieller Glob-Charakter ist, nicht die Parens. Du musst ihm entkommen. – ikegami

+0

Im zweiten Beispiel haben Sie 'c: ...' anstelle von 'c: \ ...' – ikegami

Antwort

1

Die Klammern in Namen sollten kein Problem darstellen. (Es sei denn, die Zeichenfolge wird in Ausdrücken ausgewertet, in denen sie eine Bedeutung haben.) Danke an ikegami für den Kommentar, der mich zum Testen zurücksendet.

Allerdings ist der Raum ein Problem mit glob und braucht

my $src = 'c:\temp\ (1)J'; 

foreach my $f (glob "$src/*") { 
    move $f, "\out"; 
} 

Beachten Sie, dass glob gibt die Datei mit dem Pfad entkommen, so dass Sie nicht brauchen (noch wollen) Pfad hinzuzufügen. Beachten Sie auch, dass wir brauchen die die einfachen Anführungszeichen, wenn $src zugeordnet ist, oder q().

Das Problem ist, dass mit $dir = 'dir A' nach "$dir" der glob hat dir A, die es als Verzeichnisse interpretiert dir und A (gilt auch für Dateien geht). Daher müssen Sie Leerzeichen irgendwie umgehen, oder doppelte Anführungszeichen, glob qq{"$src/*"}, wo die äußeren Anführungszeichen alle "Wörter" in eine Zeichenfolge ziehen.

Es ist besser File::Glob in Bezug auf Räume zu verwenden, das nicht über dieses Problem

: bsd_glob
Die :bsd_glob Export-Tag Exporte bsd_glob() und den unten aufgeführten Konstanten. Es überschreibt auch glob() im aufrufenden Paket mit einem, das sich wie bsd_glob() in Bezug auf Leerzeichen verhält (der Speicherplatz wird als Teil eines Dateinamens behandelt), unterstützt jedoch Iteration im skalaren Kontext; h., es behält das Merkmal der Kernfunktion bei, das nächste Element jedesmal zurückzugeben, wenn es aufgerufen wird.

Achten Sie jedoch darauf, NOTES über die Verwendung von (zurück) Schrägstriche unter Windows zu sehen. Auszug

  • Auf DOSISH Systemen ist Backslash ein gültiges Verzeichnis-Trennzeichen.
    ...
  • Win32-Benutzer sollten den echten Schrägstrich verwenden.Wenn Sie wirklich Schrägstriche verwenden möchten, sollten Sie File::DosGlob mit Sarathy ist, die mit der Standard-Perl-Distribution

Mit dem File::DosGlob kommt, wird man wieder Räume zu entkommen.