web-dev-qa-db-fra.com

Vérification de l'existence de plusieurs répertoires

Je veux vérifier l'existence de plusieurs répertoires, disons, dir1, dir2 et dir3, dans le répertoire de travail.

J'ai ce qui suit

if [ -d "$PWD/dir1" ] && [ -d "$PWD/dir2" ] && [ -d "$PWD/dir3" ]; then
    echo True
else
    echo False
fi

Mais je soupçonne qu'il y a un moyen plus élégant de faire cela. Ne présumez pas qu'il y a un motif dans les noms des répertoires.

L'objectif est de vérifier l'existence de quelques répertoires et de l'inexécution des autres.

J'utilise Bash, mais le code portable est préféré.

9
Elegance

Si vous vous attendez déjà à ce qu'ils soient des répertoires et que vous vérifiez simplement si elles existent tous, vous pouvez utiliser le code de sortie de l'utilitaire ls pour déterminer si une ou plusieurs "Erreurs s'est produite" := :=:

ls "$PWD/dir1" "$PWD/dir2" "$PWD/dir3" >/dev/null 2>&1 && echo All there

Je redirigeai la sortie et STDERR à /dev/null Afin de le faire disparaître, car nous ne nous soucions que du code de sortie de ls, pas sa production. Tout ce qui est écrit à /dev/null disparaît - il n'est pas écrit à votre terminal.

5
Jeff Schaller

Je bougeais:

result=True
for dir in \
        "$PWD/dir1" \
        "$PWD/dir2" \
        "$PWD/dir3" 
do
    if ! [ -d "$dir" ]; then
        result=False
        break
    fi
done
echo "$result"

Le break provoque la boucle à court-circuit, tout comme votre chaîne de &&

9
glenn jackman

Une boucle pourrait être plus élégante:

arr=("$PWD/dir1" "$PWD/dir2" "$PWD/dir2")
for d in "${arr[@]}"; do
    if [ -d "$d"]; then
        echo True
    else
        echo False
    fi
done

Ceci est bash. Un plus portable est sh. Là, vous pouvez utiliser la matrice de position:

set -- "$PWD/dir1" "$PWD/dir2" "$PWD/dir2"

Puis pour boucler sur elle utilisation "$@".

5
user147505

Pourquoi pas seulement:

if [ -d "dir1" -a -d "dir2" -a -d "dir3" ]; then
    echo True
else
    echo False
fi
5
David Conrad

Selon la question, deux fonctions portables Shell qui testent l'existence et inexistence de plusieurs répertoires:

# Returns success if all given arguments exists and are directories.
ck_dir_exists () {
    for dir do
        [ -d "$dir" ] || return 1
    done
}

# Returns success if none of the given arguments are existing directories.
ck_dir_notexists () {
    for dir do
        [ ! -d "$dir" ] || return 1
    done
}

Exemple:

$ mkdir dir1 dir2
$ ck_dir_exists dir1 dir2; echo $?
0
$ ck_dir_exists dir1 dir2 dir3; echo $?
1
$ ck_dir_notexists dir1 dir2 dir3; echo $?
1
$ ck_dir_notexists dir3 dir4; echo $?
0
4
Kusalananda