Utilisermkdir -p est un moyen simple pour la plupart des systèmes d’exploitation modernes:
mkdir -p foo/bar/zoo/andsoforth
Cependant, mkdir -pn'est pas recommandé dans de nombreux manuels. Lisez la documentation de GNU makeet autoconfsur les problèmes d'utilisation de mkdir -p:
Les systèmes d’installation et de configuration multiplate-forme ont leurs propres alternativesmkdir -p sûres pour .
CMake à utiliser en ligne de commande shell:
cmake -E make_directory foo/bar/zoo/andsoforth
Autoconf à utiliser dans un script avec prétraitement:
AS_MKDIR_P(foo/bar/zoo/andsoforth)
ou:
AC_PROG_MKDIR_P(foo/bar/zoo/andsoforth)
Mais ces solutions nécessitent cmakeou autoconf( M4) des outils à installer (et un prétraitement possible)
Vous pouvez également utiliser le install-shscript avec l' -doption:
install-sh -d foo/bar/zoo/andsoforth
Ce script est utilisé par autoconfet par automakeprojet. Je pense que ce doit être la solution la plus sûre.
À l'époque, je cherchais une solution multiplateforme pour des applications standard /bin/shsans dépendances, mais je n'en ai pas trouvé. J'ai donc écrit le prochain script qui n'est peut-être pas idéal, mais je pense qu'il est conforme à la plupart des exigences multi-plateformes :
#! /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
}
Ce script peut être utilisé pour les anciens systèmes, où l’option -ppour mkdirest absente.
sedUne version multiplateforme basée sur X a dirnameété ajoutée au code. Cela fonctionne avec une méthode similaire à dirname(correct avec chemin /, chemins avec nom de base uniquement, chemins avec fin /, chemins avec et sans fin \n). Cette fonction ne peut pas fonctionner correctement si le chemin contient des nouvelles lignes ou des caractères non valides pour les paramètres régionaux en cours. Il remplace également toute combinaison de /( //, ///) avec un seul/
Ligne modifiée mkdir "$1" || return 1en test -d "$1" || { mkdir "$1" || return 1; }raison de la mkdirfin de l'erreur si le chemin existe et que cette vérification est nécessaire pour les chemins contenant des constructions telles que aaa\.(Si la aaaversion précédente n'existe pas, la création est créée aaa, puis essaye de la recréer).
Cette version de mkd ne génère pas d'erreur si le chemin existe déjà (mais elle a toujours la possibilité de générer une telle erreur lors d'une exécution parallèle) et ne peut pas obtenir plusieurs répertoires en ligne de commande.