Bashファイル名拡張:特定の文字の使用を禁止

Bashファイル名拡張:特定の文字の使用を禁止

BashではFoo1.pngFoo9.pngFoo[0-9].pngFoo5.pngFoo[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.pngFool.png

Foo[^37].pngスクリプトが期待どおりに機能しない場合は、他のシェル(GNU以外のシステムでは?)を使用していないことを意味します。bashコマンドラインからdashスクリプトを実行しましたか?shその場合は、これを行わずに、#!スクリプトで正しい-lineを使用して正しいシェルソルバーを指してください。

同様の名前を除外するには、名前の後に数字がFood.png続くことを確認してからを使用します。除外するには別々にテストしてください。Foo.pngFoo[0-9].pngFoo3.pngFoo7.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

以下の説明でStéphane Chazelasが述べたように、拡張ワイルドカードパターンを使用しておよびそれ以外の数をbashテストできます。以下を使用して拡張ワイルドカードモードを有効にします。37shopt -s extglob

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

しかし、個人的にFoo[01245689].png私はこの表現が正しいことをしていると信じています。

関連情報