L'utilizzomkdir -p
è un modo semplice per la maggior parte dei sistemi operativi moderni:
mkdir -p foo/bar/zoo/andsoforth
Tuttavia, mkdir -p
non è raccomandato in molti manuali. Leggi la documentazione di GNU make
e autoconf
sui 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 cmake
o autoconf
( M4
) strumenti da installare (e l'eventuale pre-elaborazione)
Puoi usare anche lo install-sh
script con l' -d
opzione:
install-sh -d foo/bar/zoo/andsoforth
Questo script è utilizzato da autoconf
e automake
project. Penso che debba essere la soluzione più sicura.
Al momento stavo cercando una soluzione multipiattaforma per standard /bin/sh
senza 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 -p
per mkdir
è assente.
sed
la versione multipiattaforma basata su è dirname
stata 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 \n
s). 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 1
in test -d "$1" || { mkdir "$1" || return 1; }
perché mkdir
termina con errore se esiste un percorso e questo controllo è necessario per percorsi contenenti costruzioni come aaa\.
(se aaa
non esiste la versione precedente crea aaa
e 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.