Bashファイル名の拡張: 特定の文字を避ける

Bashファイル名の拡張: 特定の文字を避ける

Bash では、を使用しFoo1.pngてファイル名を指定できます。の使用を避けることができます。 小数点以下の桁を除外する一連の指定方法はありますか?Foo9.pngFoo[0-9].pngFoo5.pngFoo[1-46-9].png

たとえば、Foo3.pngと を除外したい場合はFoo7.pngを使用できますFoo[0-24-689]が、 のようなパターンの方がFoo[^37].pngはるかに読みやすいと思います。これは Vim の構文であり、Bash は と を除外して解釈しません37しかし、Bash にはファイル名の展開で文字を除外するパターンがあるかどうか疑問に思っていました。

一致する解決策があれば全て3または以外の単一文字も7、状況によっては役立つ場合があります (上記の過​​度に単純化された説明にもかかわらず、この質問のきっかけとなった特定の状況など)。

答え1

シェルbashは正規表現のようなFoo[^37].pngパターンと標準のシェル パターンの両方を理解するので、除外する必要があるやなどFoo[!37].pngの名前を持つ他のファイルがない限り、問題なく使用できます。Food.pngFool.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以外の数字をテストすることができます。 で拡張グロブパターンを有効にしてから、パターンを使用します。37shopt -s extglob

Foo!(!([0-9])|[37]).png

しかし、個人的には、この回答の前半のようにスクリプトを記述し(または使用しFoo[01245689].png)、それを実行して完了してから、この式が正しい動作をしていると信じる(実際に正しい動作をしている)と判断する方が早いでしょう。

関連情報