「ls」または正規表現は大文字と小文字を区別しませんか?


5

バッシュで、私は試しました

ls [a-z]*

そして、ファイル名が小文字のアルファベットで始まるすべてのファイルをリストすることが期待されます。しかし、名前が大文字のアルファベットで始まるファイルも表示されるのはなぜですか?

>ls [a-z]*
D  e
>

必要に応じて、bashバージョン:

bash --version GNU bash、バージョン4.1.5(1)-release(i486-pc-linux-gnu)Copyright(C)2009 Free Software Foundation、Inc.ライセンスGPLv3 +:GNU GPLバージョン3以降http:// gnu .org / licenses / gpl.html

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

* bashの正規表現ではありません*。[az]は少し正規表現のように見え、bashはそれを受け入れているようです。たとえば、ls a +はaaaとは一致しないため、正規表現をサポートしている場合はほとんど一致しません。私はどの程度までは分からない。echo a {3}、echo a \ {3 \}は単にa {3}をエコーし​​、正規表現のように解釈しません。
-barlop

ここでは、bashのパターンマッチングについての記事ですfaqs.org/docs/bashman/bashref_35.html extglobシェルオプションはshopt組み込みコマンドを使用して有効になっている場合、それは」言及は、オペレーターに一致するいくつかの拡張パターンが認識されている。以下の説明では、パターン- 。リストは`で区切られた1つのまたは複数のパターンのリストです|複合パターンは、以下のサブパターンの一つ以上を用いて形成することができる」:」しかし、私はあなたがそのオプションを有効にしたいかどうかはわかりません
barlop

cygwinでは、[az] *は[[:lower:]] *とまったく同じように見えますが、大文字は表示されません。GNU bash、バージョン3.2.51(24)-release(i686-pc-cygwin)
barlop

1
@barlop:文字範囲の動作は、ロケール、特にLC_COLLATE(多くの?)ロケールの設定に依存します。[a-z]「aAbB ... yYz」は含まれますが、「Z」は含まれません。を使用して拡張グロビングを有効にできshopt -s extglobます。Cygwinの場合[a-z][[:lower:]]Cygwinの場合で異なる結果が得られます。
デニスウィリアムソン

回答:


3

混乱が生じる正規表現ではありません。代わりに、「globbing」と呼ばれるシステムを使用します-参照:

$ man 7 glob

[az]の代わりに、[[:lower:]]を使用する必要があります。

$ ls -d [[:lower:]]*

「グロビング」はいわゆる「パス名展開」ですか?
-zhanwu

いいえ-パス名展開は/home/fred/foo.barに翻訳FOO.BAR /〜フレッドのようなものをされていない
Majenko

1

1)オペレーティングシステム、より具体的にはファイルシステムに依存する場合があります。ファイルシステムの大文字と小文字は区別されますか?OSやファイルシステムの種類については言及しません。

2)bashは、大文字と小文字を区別しないグロビングも実行できます。これがあなたの現在のケースであるかどうかを確認することができますshopt | grep nocaseglob

また、余談ですが、それlsはファイルに対して何もしていません。シェルは、ファイル名をlsに渡します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.