Linux : créer un dossier seulement s’il n’existe pas

Linux créer répertoire bash

Sous Linux, la commande qui sert à créer un nouveau dossier se nomme « mkdir ». Créer un répertoire, c’est très simple en soi, mais comment créer un dossier seulement s’il n’existe pas ? C’est à cette question que nous allons répondre !

Vous avez probablement déjà utilisé la commande mkdir si vous utilisez Linux en ligne de commande, afin de créer un dossier, peu importe la distribution que vous avez l’habitude d’utiliser. D’ailleurs, entre parenthèses, cette commande fonctionne aussi sous Windows.

1. La solution « mkdir -p »

Pour créer un dossier, par exemple nommé « dossier » (j’aurais pu faire mieux en termes d’imagination), on utilise cette commande sous Linux :

mkdir dossier

Cette commande crée le répertoire « dossier » dans l’emplacement actuel. Si je relance cette commande, une erreur s’affiche, car le dossier existe déjà :

mkdir: impossible de créer le répertoire "dossier": File exists

Pour éviter cette erreur, il y a une solution : l’option -p de la commande mkdir. Si le répertoire existe déjà, une erreur ne sera pas retournée (ce qui peut être utile dans certains scripts) et si le répertoire parent n’existe pas non plus, il sera créé également. C’est une information importante.

Ainsi, si j’exécute :

mkdir dossier -p

Qui peut s’écrire aussi comme ça (avec l’option avant le nom du dossier) :

mkdir -p dossier

La commande ne va pas retourner une erreur même si le dossier existe déjà. Comment est-ce possible ? Tout simplement parce qu’avec cette option, la commande mkdir prend la peine de vérifier si le dossier existe déjà ou non.

Voici un aperçu de l’aide de la commande « mkdir » où l’on voit clairement la présence de l’option « -p » et la description est claire sur l’usage de cette option.

Créer un dossier s'il n'existe pas Linux

Maintenant, si j’exécute cette commande :

mkdir /home/tutobox/donnees/dossier -p

La commande va créer le répertoire « donnees » car il n’existe pas et elle va aussi créer le répertoire « dossier« . Sans l’option « -p » une erreur serait retournée car le dossier « donnees » est manquant.

2. Solution n°2 : tester si un dossier existe en bash

Pour tester si un dossier existe ou non, on peut s’appuyer sur un script Bash, ce qui permet d’effectuer d’autres actions. Si le dossier existe déjà, peut-être que l’on va effectuer une action complémentaire, tandis que s’il n’existe pas, on va le créer.

Dans le script ci-dessous, la variable DOSSIER sert à déterminer le chemin complet vers le dossier à vérifier. Ensuite, une condition « if/else » permet d’indiquer l’action à effectuer si il existe et celle à effectuer s’il existe pas. Dans le cas où il n’existe pas, il sera créé avec mkdir. Dans les deux cas, un message informatif est écrit dans le Terminal.

#!/bin/bash
DOSSIER=/home/tutobox/dossier

if [ -d "$DOSSIER" ]; then
    echo "Le dossier existe ($DOSSIER)"
else
    echo "Le dossier n'existe pas ($DOSSIER). Il va être créé"
    mkdir $DOSSIER
fi

Créez le script avec l’éditeur de texte « nano » ou un autre éditeur tel que « vi » en fonction de vos préférences habituelles :

nano dossier.sh

Indiquez le code ci-dessus dans le fichier du script « dossier.sh », en adaptant le chemin du dossier à vérifier, et éventuellement en ajoutant d’autres actions, enregistrez.

Ajoutez les droits d’exécution sur le fichier « dossier.sh » sinon nous ne pourrons pas l’exécuter sur la machine locale :

chmod +x dossier.sh

Puis, exécutez ce script pour le tester :

./dossier.sh

Voici un exemple de retour dans la console Linux. Bien entendu, si le répertoire n’existe pas, le message sera différent et le répertoire sera créé par le script.

Suite à la lecture de cet article de la boîte à tutoriels, vous savez comment utiliser « mkdir -p » et comment tester l’existence d’un répertoire avec un script Bash. À vous de choisir la méthode que vous préférez utiliser selon vos besoins.

Ressources :

Vous aimerez aussi...

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *