私はファイル名のリストを処理し(図のようにglob拡張を使用してfor f in *
)、そのリストのサブセットをファイルに出力するbashスクリプトを作成しました。次に、ファイルの内容を配列として読み取って文字列を比較するために、明確な<
AND演算子を使用して特定の>
ファイル名の単純なバイナリ検索を実行しました。
このスクリプトがLinux、MacOS、MinGWなどのさまざまな環境で動作することを望んでいることを考慮すると(移植性の低い環境を使用しますが[[
)stat
、私の質問は次のとおりです。
- ファイルの内容をソートする必要があります(
sort
bashコードを使用または追加する)、またはglob拡張子はすべての環境で常にソートされますか? 条件付き演算子は
sort
拡張(またはそれ以降)と同じ「順序」を使用しますか?(どのような状況で?)後に拡張または返されますが、条件付き
sort
演算子を使用することは以前に発生しますか?この問題を解決するには、どのオプションを使用する必要がありますか?file10.txt
file2.txt
file10.txt
file2.txt
sort
私のファイル名の一部がUnicodeの場合、考慮する必要がありますか?
- 特定のバージョンのbashを使用するのに問題がありますか?
LC_COLLATE
上記に影響しますか?
明らかに、バイナリ検索が期待どおりに機能するには、演算子のソート「方法」と一致するファイルの内容が必要です。
答え1
はい、グローバル拡張は常にソートされます。
bashから(からLESS=+/'^ *Pathname Expansion' man bash
)
パス名の拡張...単語はパターンとして扱われます。パターンに一致するファイル名のアルファベット順のリストに置き換えられます。
これもPOSIX globで指定:
...パス名は、LC_COLLATEカテゴリの現在の設定で定義されているソート順でソートされます。
注1:GLOB_NOSORT
フラグが設定されていない場合。この場合、順序は指定されません。
ノート2:ソート順はアルファベット順(数字ではない)で、2の前に10が付きます。
答え:
- ファイルの内容を並べ替える必要があります(ソートまたは追加のbashコードを使用)...
Globingはファイルの内容とは無関係で、ファイル名のみが関連付けられています。 「ファイルの内容」を並べ替える必要がある場合は、はい。かなり多くのコードを使用する
必要があります。sort
bash
- ...または、すべての環境でグローバル拡張が常にソートされていますか?
無効にしない限り、Globing結果はGLOB_NOSORT
環境のソート順(変数)で定義されている順序でソートされます。LC_COLLATE
同じソート順序を持つには、同じ有効な照合順序が必要です。どちらも変数を設定LC_COLLATE
し、locale
同じ照合の詳細を含む説明を持ちます。
- 条件付き演算子は拡張(またはソート)と同じ「ソート」を使用しますか?
はい。どちらも同じ方法で影響を受けますLC_COLLATE
。
- 拡張またはソートすると、file2.txtの後にfile10.txtが返されますが(どのような場合ですか?)条件付き演算子file10.txtを使用すると、file2.txtの前に返されますか?この問題を解決するには、どのソートオプションを使用する必要がありますか?
10
beforeの結果2
は「事前順」であり、これはbashマニュアルの説明で「アルファベット順」と呼ぶのと同じです。したがって、bash(またはPOSIXシェル)を使用してソートする場合、これはすべての場合に得られる順序です。何の問題もないため、修正できません(テキストの場合)。
sort
ただし、(シェルの外側の外部ツール)を使用することを選択した場合は、numeric
ソート(-nオプション)を要求すると2
入力されます10
。あるいは、テキストから数値を抽出して-lt
-gt
整数比較を実行するために使用することもできます。シェル(整数算術記号)。
私のファイル名の一部がUnicodeの場合、考慮する必要がありますか?
時間とUNICODEのバージョンによって変わります。
おなじみの言語で素晴らしい結果を得ることもできます。たとえば、
簡単に言うと「驚くべき準備をしなさい」です。
特定のバージョンのbashを使用するのに問題がありますか?
さて、bash 2.0以降のバージョンを使用する必要があります
respect LC_COLLATE 2.0
LC_COLLATEは上記の項目に影響しますか?
可変的なLC_COLLATE
影響みんな上記の。