Dies ist eine überraschend knifflige Sache.
Grundsätzlich -d
wird nur ein einziges Argument getestet - auch wenn Sie Dateinamen mit einem regulären Ausdruck abgleichen könnten.
Eine Möglichkeit wäre, das Problem umzudrehen und Verzeichnisse auf eine Regex-Übereinstimmung zu testen, anstatt die Regex-Übereinstimmung für Verzeichnisse zu testen. Mit anderen Worten, durchlaufen Sie alle Verzeichnisse $HOME
mit einem einfachen Shell-Glob und testen Sie jedes mit Ihrer Regex, brechen Sie eine Übereinstimmung ab und testen Sie schließlich, ob das BASH_REMATCH
Array nicht leer ist:
#!/bin/bash
for d in "$HOME"/*/; do
if [[ $d =~ (ana|mini)conda[0-9]? ]]; then
break;
fi
done
if ((${#BASH_REMATCH[@]} > 0)); then
echo "anaconda/miniconda directory is found in your $HOME"
else
echo "anaconda/miniconda is not found in your $HOME"
fi
Eine alternative Möglichkeit wäre, anstelle des regulären Ausdrucks einen erweiterten Shell-Glob zu verwenden und alle Glob-Übereinstimmungen in einem Array zu erfassen. Testen Sie dann, ob das Array nicht leer ist:
#!/bin/bash
shopt -s extglob nullglob
dirs=( "$HOME"/@(ana|mini)conda?([0-9])/ )
if (( ${#dirs[@]} > 0 )); then
echo "anaconda/miniconda directory is found in your $HOME"
else
echo "anaconda/miniconda is not found in your $HOME"
fi
Durch das Trailing wird /
sichergestellt, dass nur Verzeichnisse abgeglichen werden. die nullglob
verhindern , dass die Shell die unerreichte Zeichenfolge im Fall von Null Spielen von der Rückkehr.
Um entweder rekursiv zu machen, setzen Sie die globstar
Shell-Option ( shopt -s globstar
) und dann jeweils: