Utilisermkdir -p
est un moyen simple pour la plupart des systèmes d’exploitation modernes:
mkdir -p foo/bar/zoo/andsoforth
Cependant, mkdir -p
n'est pas recommandé dans de nombreux manuels. Lisez la documentation de GNU make
et autoconf
sur 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 cmake
ou autoconf
( M4
) des outils à installer (et un prétraitement possible)
Vous pouvez également utiliser le install-sh
script avec l' -d
option:
install-sh -d foo/bar/zoo/andsoforth
Ce script est utilisé par autoconf
et par automake
projet. Je pense que ce doit être la solution la plus sûre.
À l'époque, je cherchais une solution multiplateforme pour des applications standard /bin/sh
sans 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 -p
pour mkdir
est absente.
sed
Une 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 1
en test -d "$1" || { mkdir "$1" || return 1; }
raison de la mkdir
fin 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 aaa
version 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.