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