variable - Vérifier si un répertoire existe dans un script shell




tester si un repertoire existe powershell (20)

Plus de fonctionnalités en utilisant find

  • Vérifier l'existence du dossier dans les sous-répertoires:

    found=`find -type d -name "myDirectory"`
    if [ -n "$found"]
    then
        # The variable 'found' contains the full path where "myDirectory" is.
        # It may contain several lines if there are several folders named "myDirectory".
    fi
    
  • Vérifiez l'existence d'un ou plusieurs dossiers en fonction d'un modèle dans le répertoire actuel:

    found=`find -maxdepth 1 -type d -name "my*"`
    if [ -n "$found"]
    then
        # The variable 'found' contains the full path where folders "my*" have been found.
    fi
    
  • Les deux combinaisons Dans l'exemple suivant, il vérifie l'existence du dossier dans le répertoire en cours:

    found=`find -maxdepth 1 -type d -name "myDirectory"`
    if [ -n "$found"]
    then
        # The variable 'found' is not empty => "myDirectory"` exists.
    fi
    

Quelle commande peut être utilisée pour vérifier si un répertoire existe ou non, dans un script shell?


  1. Un script simple pour tester si dir ou fichier est présent ou non:

    if [ -d /home/ram/dir ]   # for file "if [-f /home/rama/file]" 
    then 
        echo "dir present"
    else
        echo "dir not present"
    fi
    
  2. Un script simple pour vérifier si le répertoire est présent ou non:

    mkdir tempdir   # if you want to check file use touch instead of mkdir
    ret=$?
    if [ "$ret" == "0" ]
    then
        echo "dir present"
    else
        echo "dir not present"
    fi
    

    Les scripts ci-dessus vérifieront si le répertoire est présent ou non

    $? si la dernière commande réussit, elle renvoie "0" sinon la valeur est différente de zéro. supposons que tempdir soit déjà présent, alors mkdir tempdir donnera une erreur comme ci-dessous:

    mkdir: impossible de créer le répertoire 'tempdir': le fichier existe


Avez-vous envisagé de faire tout ce que vous voulez faire dans le if plutôt que de regarder avant de sauter?

Par exemple, si vous voulez vérifier l'existence d'un répertoire avant de le saisir, essayez simplement ceci:

if pushd /path/you/want/to/enter; then
    # commands you want to run in this directory
    popd
fi

Si le chemin que vous donnez à pushd existe, vous le pushd et il se pushd par 0 , ce qui signifie que la partie then de l'instruction sera exécutée. S'il n'existe pas, rien ne se passera (à l'exception d'une sortie indiquant que le répertoire n'existe pas, ce qui est probablement un effet secondaire utile pour le débogage).

Cela semble mieux que cela, ce qui nécessite de vous répéter:

if [ -d /path/you/want/to/enter ]; then
    pushd /path/you/want/to/enter
    # commands you want to run in this directory
    popd
fi

La même chose fonctionne avec cd , mv , rm , etc ... si vous les essayez sur des fichiers qui n'existent pas, ils se fermeront avec une erreur et afficheront un message l'informant qu'il n'existe pas, et votre bloc sera alors sauté. Si vous les essayez sur des fichiers existants, la commande s'exécutera et se terminera avec un statut égal à 0 , permettant ainsi à votre bloc de s'exécuter.


En fait, vous devriez utiliser plusieurs outils pour obtenir une approche à toute épreuve:

DIR_PATH=`readlink -f "${the_stuff_you_test}"` # Get rid of symlinks and get abs path
if [[ -d "${DIR_PATH}" ]] ; Then # now you're testing
    echo "It's a dir";
fi

Pas besoin de s'inquiéter des espaces et des caractères spéciaux tant que vous utilisez "${}" .

Notez que [[]] n’est pas aussi portable que [] , mais comme la plupart des gens travaillent avec les versions modernes de Bash (car après tout, la plupart des gens ne travaillent même pas avec la ligne de commande :-p), le bénéfice est supérieur à la difficulté.


Forme plus courte:

[ -d "$DIR" ] && echo "Yes"


La commande ls associée à l'option -l (liste longue) renvoie des informations sur les attributs des fichiers et des répertoires.
En particulier, le premier caractère de la sortie ls -l est généralement un d ou un - (tiret). Dans le cas d'un d celui répertorié est un répertoire pour vous.

La commande suivante sur une seule ligne vous dira si la variable ISDIR donnée contient un chemin d'accès à un répertoire ou non:

[[ $(ls -ld "$ISDIR" | cut -c1) == 'd' ]] &&
    echo "YES, $ISDIR is a directory." || 
    echo "Sorry, $ISDIR is not a directory"

Utilisation pratique:

    [[email protected] ~]$ ISDIR="$HOME/Music" 
    [[email protected] ~]$ ls -ld "$ISDIR"
    drwxr-xr-x. 2 claudio claudio 4096 Aug 23 00:02 /home/claudio/Music
    [[email protected] ~]$ [[ $(ls -ld "$ISDIR" | cut -c1) == 'd' ]] && 
        echo "YES, $ISDIR is a directory." ||
        echo "Sorry, $ISDIR is not a directory"
    YES, /home/claudio/Music is a directory.

    [[email protected] ~]$ touch "empty file.txt"
    [[email protected] ~]$ ISDIR="$HOME/empty file.txt" 
    [[email protected] ~]$ [[ $(ls -ld "$ISDIR" | cut -c1) == 'd' ]] && 
        echo "YES, $ISDIR is a directory." || 
        echo "Sorry, $ISDIR is not a directoy"
    Sorry, /home/claudio/empty file.txt is not a directory

N'oubliez pas de toujours mettre les variables entre guillemets lors de leur référencement dans un script bash. Ces jours-ci, les enfants grandissent avec l'idée qu'ils peuvent avoir des espaces et beaucoup d'autres personnages amusants dans leurs noms de répertoires. (Espaces! À l'époque, nous n'avions pas d'espaces fantaisistes!;))

Un jour, un de ces enfants exécutera votre script avec $DIRECTORY défini sur "My M0viez" et votre script explose. Tu ne veux pas ça. Alors utilisez ceci.

if [ -d "$DIRECTORY" ]; then
    # Will enter here if $DIRECTORY exists, even if it contains spaces
fi

Ou pour quelque chose de complètement inutile:

[ -d . ] || echo "No"

Pour vérifier plusieurs répertoires, utilisez ce code:

if [ -d "$DIRECTORY1" ] && [ -d "$DIRECTORY2" ] then
    # Things to do
fi

Pour vérifier si un répertoire existe, vous pouvez utiliser une structure simple si comme ceci:

if [ -d directory/path to a directory ] ; then
#Things to do

else #if needed #also: elif [new condition] 
# things to do
fi

Vous pouvez le faire aussi en négatif

if [ ! -d directory/path to a directory ] ; then
# things to do when not an existing directory

Remarque : Faites attention, laissez des espaces vides de chaque côté des accolades d'ouverture et de fermeture.

Avec la même syntaxe, vous pouvez utiliser:

-e: any kind of archive 

-f: file 

-h: symbolic link 

-r: readable file 

-w: writable file 

-x: executable file 

-s: file size greater than zero 

Selon le commentaire de :

Si vous voulez créer le répertoire et qu'il n'existe pas encore, la technique la plus simple consiste à utiliser mkdir -p qui crée le répertoire - et tous les répertoires manquants dans le chemin - et n'échoue pas si le répertoire existe déjà. Vous pouvez donc tout faire en même temps avec:

mkdir -p /some/directory/you/want/to/exist || exit 1

Tapez ce code sur le bash promt

if [ -d "$DIRECTORY" ]; then
  # if true this block of code will execute
fi

Trouver ci-dessous peut être utilisé,

find . -type d -name dirname -prune -print

Voici un idiome très pragmatique:

(cd $dir) || return # is this a directory,
                    # and do we have access?

Je l'enveloppe généralement dans une fonction:

can_use_as_dir() { 
    (cd ${1:?pathname expected}) || return
}

Ou:

assert_dir_access() { 
    (cd ${1:?pathname expected}) || exit
}

La bonne chose à propos de cette approche est que je n’ai pas à penser à un bon message d’erreur.

cd me donnera déjà un message standard d’une ligne à stderr. Il donnera également plus d'informations que je ne pourrai vous fournir. En exécutant le cd intérieur d'un sous-shell ( ... ) , la commande n'affecte pas le répertoire actuel de l'appelant. Si le répertoire existe, ce sous-shell et la fonction sont simplement non-op.

Vient ensuite l’argument que nous passons à cd : ${1:?pathname expected} . Il s'agit d'une forme plus élaborée de substitution de paramètres, expliquée plus en détail ci-dessous.

Tl; dr: Si la chaîne passée dans cette fonction est vide, nous sortons de nouveau du sous-shell ( ... ) et revenons de la fonction avec le message d'erreur donné.

Citant la page de manuel de ksh93 :

${parameter:?word}

Si le parameter est défini et qu'il est non nul, substituez sa valeur; sinon, affiche un word et quitte le shell (si non interactif). Si word est omis, un message standard est imprimé.

et

Si les deux points : sont omis des expressions ci-dessus, le shell vérifie uniquement si le paramètre est défini ou non.

La formulation ici est propre à la documentation du shell, car word peut faire référence à toute chaîne raisonnable, y compris les espaces.

Dans ce cas particulier, je sais que le message d'erreur standard 1: parameter not set n'est pas suffisant, je fais donc un zoom avant sur le type de valeur que nous attendons ici - le pathname d' pathname d'un répertoire.

Note philosophique: Le shell n’est pas un langage orienté objet, le message dit pathname , pas directory . À ce niveau, je préférerais rester simple: les arguments d'une fonction ne sont que des chaînes.


Vous pouvez utiliser test -d (voir man test ).

-d file True si le fichier existe et est un répertoire.

Par exemple:

test -d "/etc" && echo Exists || echo Does not exist

Remarque: La commande de test est identique à l'expression conditionnelle [ (voir: man [ )], elle est donc portable entre les scripts shell.

[ - Ceci est un synonyme pour le test intégré, mais le dernier argument doit être un littéral ] , pour correspondre à l’ouverture [ .

Pour les options possibles ou une aide supplémentaire, vérifiez:

  • help [
  • help test
  • man test ou man [

[ -d ~/Desktop/TEMPORAL/ ] && echo "DIRECTORY EXISTS" || echo "DIRECTORY DOES NOT EXIST"

[[ -d "$DIR" && ! -L "$DIR" ]] && echo "It's a directory and not a symbolic link"

NB: Citer des variables est une bonne pratique.


if [ -d "$DIRECTORY" ]; then
    # Will enter here if $DIRECTORY exists
fi

Ce n'est pas tout à fait vrai ... Si vous souhaitez accéder à ce répertoire, vous devez également disposer des droits d'exécution sur le répertoire. Peut-être avez-vous également besoin de droits en écriture.

Donc:

if [ -d "$DIRECTORY" ] && [ -x "$DIRECTORY" ] ; then
    # ... to go to that directory (even if DIRECTORY is a link)
    cd $DIRECTORY
    pwd
fi
if [ -d "$DIRECTORY" ] && [ -w "$DIRECTORY" ] ; then
    # ... to go to that directory and write something there (even if DIRECTORY is a link)
    cd $DIRECTORY
    touch foobar
fi

if [ -d "$DIRECTORY" ]; then  
    # Here if $DIRECTORY exists  
fi




posix