Bashでは、ワイルドカード拡張が適切に保証されていますか?


53

Bashのワイルドカードの展開はアルファベット順であることが保証されていますか?大きなファイルを10 Mbの断片に分割して、Mercurialリポジトリで受け入れられるようにしなければなりません。

だから私は私が使用できると思っていました:

split -b 10485760 Big.file BigFilePiece.

そして次に:

cat BigFile | bigFileProcessor

私はそれをできた:

cat BigFilePiece.* | bigFileProcessor

その代わりに。

しかし、私は(別名、ワイルドカード別名、アスタリスクの拡大がいることを保証することをどこにも見つけることができなかった*ことは非常に)常にアルファベット順になります.aa前に来ました.ab(そのようなタイムスタンプの順序か何かすることはなく)。

また、私の計画に欠陥はありますか?catファイルをまとめて使用する場合のパフォーマンスコストはどれくらいですか?


4
確かにあなたは間違ったアプローチを取っています。管理者がリポジトリにあるファイルのサイズに制限を設けている場合は、管理者と話し合う必要があります。拡張について話す-私は常に拡張が英数字であることを見てきました。
ミルチャVutcovici

1
sort追加の注文操作が必要な場合は、いつでもパイプスルーできます。
ワーナー

2
Mercurialは、RAMの容量によって制限された任意のサイズのファイルを管理できることに注意してください。Mercurialはファイルをメモリに保持できると想定しているため、大きなファイルを追加すると警告が表示されます。マージの場合、Mercurialはメモリ内に2つのファイルを保持する必要があります。したがって、RAMの量が少ないマシンでは、ファイルのチェックアウトに問題が発生する場合があります。ちょうどテストしhg commitましたが、NMBファイルでは約3 * NMBのRAMとhg update2 * NMBのRAM が必要です。これは、Linux上のMercurial 1.5で発生します。
マーティンガイスラー

回答:


67

はい、グロビング拡張はアルファベット順です。

Bash manページから:

パス名展開

しない限り、単語の分割後に、-fオプションが設定されている、bashは文字の各単語をスキャンし*?、と[。これらの文字のいずれかが表示される場合、単語はパターンと見なされ、パターンに一致するファイル名のアルファベット順にソートされたリストに置き換えられます。


@Dennis Williamson、ユーザーが別の言語セットを持っている場合にこれがまだ当てはまるかどうか、考えはありますか?
ゾレダチェ

5
@Zoredache:実際にはPOSIXで指定されています:opengroup.org/onlinepubs/007908775/xsh/glob.html "LC_COLLATEカテゴリの現在の設定で定義されているように、パス名はソート順です。XBD仕様LC_COLLATE [ opengroup.org / onlinepubs / 007908775 / xbd /…」と言うのは、のls -l [[:lower:]]代わりにのようなことをすべきだからですls -l [a-z]
デニスウィリアムソン

順序はアルファベット順なので、BigFilePiece.10はBigFilePiece.2の前に来ることに注意してください
Ken

@DennisWilliamson-なぜ2組の角かっこですか?私にはまったく同じように機能するようです。
ArtOfWarfare

2
@ArtOfWarfare:これを試してください:mkdir lctest; cd lctest; touch w; touch z; ls -l [:lower:]; echo =====; ls -l [[:lower:]]。「z」ファイルは、ls小文字の1文字のファイル名を要求しているため、2番目にのみリストされます。最初のls-外側の角括弧のないもの-は、文字のリストから単一文字のファイル名を要求しています:「」、「l」、「o」、「w」、「e」、および「r」。どちらの場合も、最も外側の角括弧は、文字とクラスをリストする角括弧式を区切ります。の場合[[:lower:]]、内側の角括弧、コロン、および単語は文字クラスを表します。...
デニスウィリアムソン

4

これは文書化された動作であるbashため、スクリプトでこれに依存できます。また、他のBourne互換シェルにも非常に長い間当てはまりますが、ケースの折りたたみや英数字以外の文字に関するコーナーケースがある場合があります。

(結果のリストは、bashほぼ「ASCII-betical」の順序になります。ただし、大文字と小文字の違いはないが大文字と同等の前に小文字が照合されるかのように、小文字と大文字が照合されます。 -alphabeticsは、ASCIIで表示されるのと同じ順序で照合する必要があります。

他の人が指摘しているように、これはあなたの言語関連の環境設定によって混乱する可能性があります:LANG一般とLC_COLLATEより具体的に。Inはenv、環境をクリアする(-iまたは-u適切に使用する)コマンドの下で、glob展開の順序に依存するコマンドを実行するか、結果をパイプ処理してsort堅牢なシーケンスを確保するのが最も安全です。


4
ソート処理では、英数字以外はすべて無視されるようです。したがって、「=」、「_」、「〜」を使用して、ファイルを強制的にリストを開始または終了することはできません。
オテウス

3

glob展開はアルファベット順にソートされますが、シェルの言語設定に従います。

これを移植可能にする場合は、スクリプトでこれを「C」に設定してください。

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