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é.
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.
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 &&
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 "$@"
.
Pourquoi pas seulement:
if [ -d "dir1" -a -d "dir2" -a -d "dir3" ]; then
echo True
else
echo False
fi
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