Bash では、を使用しFoo1.png
てファイル名を指定できます。の使用を避けることができます。 小数点以下の桁を除外する一連の指定方法はありますか?Foo9.png
Foo[0-9].png
Foo5.png
Foo[1-46-9].png
たとえば、Foo3.png
と を除外したい場合はFoo7.png
を使用できますFoo[0-24-689]
が、 のようなパターンの方がFoo[^37].png
はるかに読みやすいと思います。これは Vim の構文であり、Bash は と を除外して解釈しません3
。7
しかし、Bash にはファイル名の展開で文字を除外するパターンがあるかどうか疑問に思っていました。
一致する解決策があれば全て3
または以外の単一文字も7
、状況によっては役立つ場合があります (上記の過度に単純化された説明にもかかわらず、この質問のきっかけとなった特定の状況など)。
答え1
シェルbash
は正規表現のようなFoo[^37].png
パターンと標準のシェル パターンの両方を理解するので、除外する必要があるやなどFoo[!37].png
の名前を持つ他のファイルがない限り、問題なく使用できます。Food.png
Fool.png
Foo[^37].png
がスクリプト内で期待どおりに動作しない場合は、bash
ではなく、たとえば などの他のシェルを使用していることを示していますdash
(おそらく非 GNU システム上でしょうか?)。コマンド ラインで を使ってスクリプトを実行しましたか? そうである場合は、 を使用せず、正しいシェル インタープリターを指す適切な -line をスクリプト内でsh
使用してください。#!
Food.png
除外したい のような名前があると仮定して、Foo
の後に数字が続くことを確認するには.png
、 を使用しますFoo[0-9].png
。 と をFoo3.png
これらFoo7.png
から除外するには、これらを個別にテストします。
for name in Foo[0-9].png; do
case $name in (*[37].png) continue; esac
# process "$name" here
done
または、bash
構文を使用して、
for name in Foo[0-9].png; do
[[ $name == *[37].png ]] && continue
# process "$name" here
done
ステファン・シャゼラスが以下のコメントで述べているように、 で拡張グロブパターンを使用して、とbash
以外の数字をテストすることができます。 で拡張グロブパターンを有効にしてから、パターンを使用します。3
7
shopt -s extglob
Foo!(!([0-9])|[37]).png
しかし、個人的には、この回答の前半のようにスクリプトを記述し(または使用しFoo[01245689].png
)、それを実行して完了してから、この式が正しい動作をしていると信じる(実際に正しい動作をしている)と判断する方が早いでしょう。