kshの正規表現は、tgz、tar.tgzを拡張するために使用されます。

kshの正規表現は、tgz、tar.tgzを拡張するために使用されます。

tgz次の拡張子を持つファイルを識別するために正規表現(ksh)を取得しようとしていますtar.gz。いろいろ試してみましたが、うまくいきませんでした。私はこの正規表現を使用してこれらの拡張子を持つファイルのみを選択していくつかの処理を行います。TGZTAR.GZ

if [ -f $myregexp ]; then
   ..... 
fi

答え1

[ -f "$myregexp" ]またはという[[ -f $myregexp ]]変数があるかどうかをテストします$myregexp。 (小括弧には二重引用符が必要です。)

globパターンに一致するファイルが存在するかどうかをテストしたい場合は、直接的な方法はありません。 2つのステップで行う必要があります。まず、一致リストを作成し、リストが空であるかどうかをテストします。

a=( ~(Ni)*.@(tgz|tar.gz) )
if [[ ${#a} -ne 0 ]]; then …

これはさまざまなksh関連機能を使用します。

  • ~(N)一致するものがない場合、空のプレフィックスのリストが生成されます。
  • ~(i)大文字と小文字を区別しない一致のための接頭辞です。
  • @(foo|bar)一致させるglob構文fooまたはbar

これはbashと同じです。 Bashでは、構文やその他のksh glob拡張extglobに使用されるオプションから、一致しないグローバル変数と大文字と小文字を区別しないNULL拡張を取得できます。@(foo|bar)

shopt -s nocaseglob nullglob extglob
a=( *.@(tgz|tar.gz) )
if [[ ${#a} -ne 0 ]]; then …

これはzshと同じです。このオプションは、大文字と小文字を区別しない一致プレフィックスextended_globに必要です。(#i)glob(N)修飾子は、globの空の拡張子が一致しないことを示します。

setopt extended_glob
a=( (#i)*.(tgz|tar.gz)(N) )
if [[ ${#a} -ne 0 ]]; then …

答え2

あなたの例は、どのソースと比較しているかについての手がかりを提供しません。現在のディレクトリのファイルを一覧表示するには、いくつかのglobを一緒に文字列で囲むことができます。

for file in *.tgz *.tar.gz *.TGZ *.TAR.GZ; do
    echo $file
done

パターンの文字列のファイル名をテストするには、次のようにします。

if [[ ( $file =~ .*\.(tgz|TGZ|tar\.gz|TAR\.GZ) ) ]]; then
    echo $file
fi

または、次のように Case ステートメントを使用できます。

case $file in
    *.tgz|*.tar.gz|*.TGZ|*.TAR.GZ)
        echo $file
        ;;
esac

答え3

glob式のみを使用して、大文字と小文字を区別しない一致を実行することもできます。

for f in *.[Tt][Gg][Zz] *.[Tt][Aa][Rr].[Gg][Zz]; do
   echo $f
done

関連情報