In Perl, wie kann ich ein Unterverzeichnis erstellen und gleichzeitig übergeordnete Verzeichnisse erstellen, wenn sie nicht existieren? Wie der Befehl mkdir -p von UNIX?Wie erstelle ich ein Verzeichnis und übergeordnete Verzeichnisse in einem Perl-Befehl?
Antwort
use File::Path qw(make_path);
make_path("path/to/sub/directory");
Die veraltete mkpath und bevorzugte make_path ergab sich aus einer Diskussion in Perl 5 Porters fädeln, dass here archiviert wird.
Kurz gesagt, Perl 5.10 Tests ergab Unbeholfenheit in der Argumentanalyse der Schnittstelle makepath(). Also wurde es durch eine einfachere Version ersetzt, die einen Hash als letztes Argument für die Festlegung von Optionen für die Funktion verwendete.
@skiphoppy: Dies ist immer noch nicht "wie UNIX mkdir -p-Befehl" wie in der Frage angegeben. mkdirs Manpage zeigt -p, --parents no error if existing, make parent directories as needed
Aber make_path gibt false zurück, wenn das Verzeichnis existiert. (zB make_path "/ tmp/foo" oder sterben; # wird sterben, wenn/tmp/foo existiert) –
Randall
Verwenden mkpath aus dem Modul File :: Path:
use File::Path qw(mkpath);
mkpath("path/to/sub/directory");
Das gerade jetzt erforschend, sehe ich, dass mkpath() veraltet ist und die offizielle Schnittstelle nun make_path() ist. Wenn jemand eine großartige Erklärung für das, was uns kauft, aufschreibt, werde ich das zur akzeptierten Antwort machen. – skiphoppy
ref http://perldoc.perl.org/File/Path.html
„Die make_path Funktion der angegebenen Verzeichnisse erstellt, wenn sie existiert nicht [sic!] Vor, ähnlich wie der Unix-Befehl mkdir -p
“
Bitte ignorieren, wenn Sie für eine Perl suchen Modul mit ‚mkdir -p‘ Funktionalität, aber der folgende Code funktionieren würde:
my $dir = '/root/example/dir';
system ("mkdir -p $dir 2> /dev/null") == 0
or die "failed to create $dir. exiting...\n";
Sie ein Modul verwenden können, aber dann haben Sie es auf jedem Server auf Sie gehen in den Hafen Code zu installieren. Normalerweise bevorzuge ich Systemfunktion für eine Arbeit wie mkdir, weil es einen geringeren Aufwand zum Importieren und Aufrufen eines Moduls benötigt, wenn ich es nur einmal brauche, um ein Verzeichnis zu erstellen.
Dieser Ansatz macht Sinn, wenn Sie die Installation von Modulen vermeiden wollen. Normalerweise bevorzuge ich die Installation von Modulen, die ich brauche, oder ich lehne es ab, das System zu unterstützen. :) Ich bevorzuge die Verwendung von Modulen, so dass ich die Vorteile der Tests und Untersuchungen nutzen kann, die in sie einflossen. So kann ich Fehler vermeiden, wie zum Beispiel Systemaufrufe nicht zu überprüfen oder Ausgaben von Fehlermeldungen zu verlieren, und weniger Aufwand um einen Prozess zu erstellen. – skiphoppy
Erstellt das keine Abhängigkeit vom Betriebssystem? –
Diese Frage wurde hinzugefügt, damit ich sie in Zukunft wieder leicht finden kann, anstatt sie jedes Mal nachzuschlagen. Ich suche immer in POSIX.pm, aus irgendeinem Grund. – skiphoppy