次のようなファイルがあるとしましょう。
test_file-1234-master.tar.gz
tar
次のコマンドを使用してキャンセルしようとしました。
tar -xf test_file-[0-9]+-master.tar.gz
tar -xf test_file-[:digit]-master.tar.gz
しかし幸運はありません。このパターンをどのように合わせますか?
メモ:常にファイルがあります。複数のファイルを開いたくありません。
答え1
+
拡張正規表現メタ文字とPOSIX文字クラス(およびそれぞれ)をワイルドカードパターンとして使用しようとしました。[:digit:]
bash
同様の「基本」ワイルドカードは、いくつかのワイルドカードのみをサポートすると仮定します。たとえば、次のようになります。
?
: 単一文字*
:0個以上の文字[]
:キャラクタークラス{}
:リスト[!]
:文字クラスを否定する
拡張正規表現のメタ文字とは異なり、「デフォルト」ワイルドカードでは、ワイルドカードの動作を固定された発生回数と一致するように変更することはできません。
したがって、「基本」ワイルドカードを使用すると、最も短くて簡潔なパターンは次のようになります。
tar -xf test_file-[0-9][0-9][0-9][0-9]-master.tar.gz
答え2
ksh
、のみbash -O extglob
:zsh -o kshglob
test_file-+([[:digit:]])-master.tar.gz
あなたはbash
設定する必要がありますextglob
オプションが最初です。これは+(...)
、特定のパターンが1つ以上発生することと一致します。[:digit:]
括弧内の式[...]
がPOSIX定義の場合キャラクタークラスこれには、インド - アラビア語の10進数([[:digit:]]
または同じ)が含まれます。[0123456789]
[0-9]
以下と一致します。
test_file-1234-master.tar.gz
test_file-1-master.tar.gz
test_file-123456789-master.tar.gz
そうだろういいえマッチ:
test_file-1b-master.tar.gz
test_file--master.tar.gz
test_file-a1-master.tar.gz
test_file-abcd-master.tar.gz
test_file-Ⅵ-master.tar.gz # roman numeral
test_file-٨-master.tar.gz # Eastern Arabic decimal digit
あなたの質問のコマンドは、tar
次のように実行する必要があります(ループを使用)。
shopt -s extglob # bash
# setopt kshglob # zsh
for f in test_file-+([[:digit:]])-master.tar.gz; do
tar xf "$f"
done
より慣用的な短い構文zsh
は次のとおりです。
setopt extendedglob
for f (test_file-[0-9]##-master.tar.gz) tar xf $f
(regexpおよびor#
の拡張グローバル変数と同じ)*
##
+