Die Verwendungmkdir -p ist für die meisten modernen Betriebssysteme ein einfacher Weg:
mkdir -p foo/bar/zoo/andsoforth
In mkdir -pvielen Handbüchern wird dies jedoch nicht empfohlen. Lesen Sie die Dokumentation zu GNU makeund autoconfzu 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 cmakeoder autoconf( M4) Tools installiert werden (und mögliche Vorverarbeitung)
Sie können auch install-shSkript mit -dOption verwenden:
install-sh -d foo/bar/zoo/andsoforth
Dieses Skript wird von autoconfund automakeproject 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/shohne 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 -pfür mkdirfehlt.
sed-basierte plattformübergreifende Version von dirnamewurde zum Code hinzugefügt. Es funktioniert auf ähnliche Weise wie dirname(richtig mit Pfad /, nur Pfade mit Basisnamen /, Pfade mit und ohne nachfolgendem \ns). 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 1in test -d "$1" || { mkdir "$1" || return 1; }weil wird mkdirmit Fehler beendet, wenn Pfad vorhanden ist und diese Prüfung für Pfade mit Konstruktionen wie erforderlich ist aaa\.(Wenn aaanicht vorhanden, wird die vorherige Version erstellt aaaund 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.