Die Verwendungmkdir -p
ist für die meisten modernen Betriebssysteme ein einfacher Weg:
mkdir -p foo/bar/zoo/andsoforth
In mkdir -p
vielen Handbüchern wird dies jedoch nicht empfohlen. Lesen Sie die Dokumentation zu GNU make
und autoconf
zu Problemen bei der Verwendung von mkdir -p
:
Die plattformübergreifenden Installations- und Konfigurationssysteme haben ihre eigenen sicheren Alternativen fürmkdir -p
.
CMake zur Verwendung in der Shell-Befehlszeile:
cmake -E make_directory foo/bar/zoo/andsoforth
Autoconf zur Verwendung in Skripten mit Vorverarbeitung:
AS_MKDIR_P(foo/bar/zoo/andsoforth)
oder:
AC_PROG_MKDIR_P(foo/bar/zoo/andsoforth)
Aber diese Lösungen erfordern cmake
oder autoconf
( M4
) Tools installiert werden (und mögliche Vorverarbeitung)
Sie können auch install-sh
Skript mit -d
Option verwenden:
install-sh -d foo/bar/zoo/andsoforth
Dieses Skript wird von autoconf
und automake
project verwendet. Ich denke, es muss die sicherste Lösung sein.
Zu der Zeit habe ich nach einer plattformübergreifenden Lösung für Standard /bin/sh
ohne Abhängigkeiten gesucht , aber keine gefunden. Aus diesem Grund habe ich das nächste Skript geschrieben, das möglicherweise nicht ideal ist, aber meiner Meinung nach die meisten plattformübergreifenden Anforderungen erfüllt :
#! /bin/sh
cdirname() # cross platform alternative for 'dirname'
{
# $1 - path
test $# -eq 1 || { echo "Procedure 'cdirname' must have only one parameter. Scripting error."; exit 1; }
echo "$1" | sed -n -e '1p' | sed -e 's#//*#/#g' -e 's#\(.\)/$#\1#' -e 's#^[^/]*$#.#' -e 's#\(.\)/[^/]*$#\1#' -
}
mkd() # cross platform alternative for 'mkdir -p'
{
# $1 - directory to create
test $# -eq 1 || { echo "Function 'mkd' can create only one directory (with it's parent directories)."; exit 1; }
test -d "$1" && return 0
test -d "$(cdirname "$1")" || { mkd "$(cdirname "$1")" || return 1; }
test -d "$1" || { mkdir "$1" || return 1; }
return 0
}
Dieses Skript kann für alte Systeme verwendet werden, bei denen die Option -p
für mkdir
fehlt.
sed
-basierte plattformübergreifende Version von dirname
wurde zum Code hinzugefügt. Es funktioniert auf ähnliche Weise wie dirname
(richtig mit Pfad /
, nur Pfade mit Basisnamen /
, Pfade mit und ohne nachfolgendem \n
s). Diese Funktion kann nicht korrekt ausgeführt werden, wenn der Pfad Zeilenumbrüche oder ungültige Zeichen für das aktuelle Gebietsschema enthält. Es ersetzt auch jede Kombination von /
( //
, ///
) mit single/
Geänderte Zeile mkdir "$1" || return 1
in test -d "$1" || { mkdir "$1" || return 1; }
weil wird mkdir
mit Fehler beendet, wenn Pfad vorhanden ist und diese Prüfung für Pfade mit Konstruktionen wie erforderlich ist aaa\.
(Wenn aaa
nicht vorhanden, wird die vorherige Version erstellt aaa
und dann versucht, sie erneut zu erstellen).
Diese Version von mkd generiert keinen Fehler, wenn der Pfad bereits vorhanden ist (es besteht jedoch weiterhin die Möglichkeit, einen solchen Fehler bei der parallelen Ausführung zu generieren), und es können nicht mehrere Verzeichnisse in der Befehlszeile abgerufen werden.