L'utilizzomkdir -p è un modo semplice per la maggior parte dei sistemi operativi moderni:
mkdir -p foo/bar/zoo/andsoforth
Tuttavia, mkdir -pnon è raccomandato in molti manuali. Leggi la documentazione di GNU makee autoconfsui problemi con l'utilizzo di mkdir -p:
I sistemi di installazione e configurazione multipiattaforma hanno le loro alternativemkdir -p sicure per .
CMake da usare nella riga di comando della shell:
cmake -E make_directory foo/bar/zoo/andsoforth
Configurazione automatica da utilizzare nello script con preelaborazione:
AS_MKDIR_P(foo/bar/zoo/andsoforth)
o:
AC_PROG_MKDIR_P(foo/bar/zoo/andsoforth)
Ma queste soluzioni richiedono cmakeo autoconf( M4) strumenti da installare (e l'eventuale pre-elaborazione)
Puoi usare anche lo install-shscript con l' -dopzione:
install-sh -d foo/bar/zoo/andsoforth
Questo script è utilizzato da autoconfe automakeproject. Penso che debba essere la soluzione più sicura.
Al momento stavo cercando una soluzione multipiattaforma per standard /bin/shsenza dipendenze, ma non ne ho trovata una. Pertanto ho scritto il prossimo script che potrebbe non essere l'ideale, ma penso che sia conforme alla maggior parte dei requisiti multipiattaforma :
#! /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
}
Questo script può essere utilizzato per vecchi sistemi, dove l'opzione -pper mkdirè assente.
sedla versione multipiattaforma basata su è dirnamestata aggiunta al codice. Funziona in modo simile a dirname(correggi con percorso /, percorsi con solo nome di base, percorsi con trailing /, percorsi con e senza trailing \ns). Questa funzione non può funzionare correttamente se il percorso ha nuovi caratteri o alcuni caratteri non validi per la locale corrente. Sostituisce anche qualsiasi combinazione di /( //, ///) con singolo/
La linea modificata mkdir "$1" || return 1in test -d "$1" || { mkdir "$1" || return 1; }perché mkdirtermina con errore se esiste un percorso e questo controllo è necessario per percorsi contenenti costruzioni come aaa\.(se aaanon esiste la versione precedente crea aaae quindi tenta di crearla di nuovo).
Questa versione di mkd non genera un errore se esiste già un percorso (ma ha ancora la possibilità di generare tale errore nell'esecuzione parallela) e non può ottenere diverse directory nella riga di comando.