私たちが知っているように、bashコマンドを実行すると、フォルダが存在するかどうかを簡単に確認できます。
[[ -d /opt/presto-server ]] && echo folder exist
しかし、フォルダがあれば
/opt/presto-server-32.34
では、正規表現を使用してフォルダが存在するかどうかを確認できますか?
このルールで
presto-server-<any charecter>
〜のように
presto-server-454.545
presto-server-4a-434
presto-server-aa-434-l
など
答え1
ワイルドカード拡張によってどれだけの引数が発生したかを計算しましょう。まず、nullglob
一致するものがない場合は、ワイルドカード自体の代わりに予想されるゼロを取得するように設定します。
shopt -s nullglob
次に、目的のスキーマの拡張を要求し、それを現在のパラメータに設定します。
set -- /opt/presto-server-*/
後ろにスラッシュが追加されることに注意してください。これを行うには、結果の一致がディレクトリ(またはディレクトリへのシンボリックリンク)である必要があります。
それから何があるか尋ねてください。
[ "$#" -gt 0 ] && echo "There are one or more presto-server- directories"
答え2
次の関数を定義できますhas_dirs
。
has_dirs() {
for f do
[ -d "$f" ] && return
done
false
}
次のように使用してください。
if has_dirs /opt/presto-server-*; then
echo there are matching dirs
fi
これは、ディレクトリまたはディレクトリへのシンボリックリンクに対して機能します。ディレクトリの場合のみ、次のものが必要です。
[ -d "$f" ] && [ ! -L "$f" ] && return
より具体的に一致させるには、をprestor-server-<number>-<number>
使用してbash
次のようにします。
shopt -s extglob # to enable a subset of ksh extended globs
has_dirs /opt/presto-server-+([[:digit:]])-+([[:digit:]])
/opt/presto-server-+([[:digit:]])-+([[:digit:]])
誤った肯定が発生する可能性がありますが、リテラル(failglob
またはnullglob
この問題を解決するオプション)というディレクトリがあります。
答え3
次に切り替えるオプションが提供されている場合zsh
:
if ()(($# > 0)) /opt/presto-server-*(N/); then
echo there are directories matching that pattern
fi
どこ
() compound-command args
パラメータを持つ匿名関数です。((...))
...
: 算術式を評価して返す複合コマンド成功結果がゼロでない場合。$# > 0
$#
: (匿名関数の引数) が 0 より大きい場合、1 と評価される算術式です。(N/)
:glob修飾子:N
このglobに対して開きます。このタイプのファイルのみを選択してください。nullglob
/
目次(-/
ディレクトリへのシンボリックリンクも含めるように変更されました)。
これは後でソートされるディレクトリの完全なリストを計算します(一致するファイルごとにzsh
作業が必要ですlstat()
)、非常に効率的ではありませんが、ディレクトリを1つだけ見つけるだけで十分です。
で区切られた一連の数字と具体的に一致するように*
変更できます。<->-<->
-
もちろん、内部ではbash
いつでも次のことができます。
if zsh -c '()(($# > 0)) /opt/presto-server-<->-<->(N/)'; then
echo there are directories matching that pattern
fi