Bashで正規表現を使用してフォルダが存在するかどうかをテストする方法は?

Bashで正規表現を使用してフォルダが存在するかどうかをテストする方法は?

私たちが知っているように、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

関連情報