{1,2,3}と{1..3}の違い


17

シーケンス{1,2,3}との間に違いはあり{1..3}ますか?

たとえば、いくつかのファイルがある場合

file.1
file.2
file.3

そして私catは彼らと一緒に使いcat file.{1..3} > fileたいのですか?

私が知っていることcat file.*>fileは、シェルが時々ランダムな方法でファイルを展開できるため問題を引き起こす可能性があることです(これはinodeに依存すると思いますか?)


1
使用cat file.[123] >file
-mikeserv

3
の拡張順序はfile.*iノードに依存しません。常に辞書式に並べ替えられますが、これはロケート設定によって異なります。
バーマー

1
「inodeに依存する」は、よりよく研究された犯罪者の心の「コンピューター」シーンの1つの段階のように聞こえます。
アレックティール

1
@mikeserv、私はそれを手に入れたと思います。これはシェルグロブであるため、実際に存在するファイルにのみ展開されますよね?対 file.{1..3}存在するかどうかにかかわらず、3つすべてに拡張されます。
ワイルドカード

1
@Wildcard-正しい、少なくとも1つが存在する限り、つまり。そうでない場合は、まったく拡張せず、catエラーfile.[123] not foundまたは非常に有用な何かが表示されます。
mikeserv

回答:


18

{1..3}{1,2,3}同じ結果を生成しますが、方法は異なります。

一般的には、{n1..n2}(これは、最初から来てzshbashそしてksh後でそれをコピーした)場合n1n2整数との間のすべての数値を生成しているn1n2。しばらく{x,y,z}農産物の三文字xyz

あなたの場合、あなたは使用しても安全です cat file.{1..3} > file

さて、の場合、すべてのファイル名で始まるシェルのグロビングcat file.*>fileを使用し、現在のロケールの照合順序に基づいて結果がソートされます。file.

まだ安全ですが、10個を超えるファイルがある場合はもう安全ではありません。{1..10}あなたに与えます1 2 3 4 5 6 7 8 9 10。グロビングしながら、あなたは得るでしょう1 10 2 3 4 5 6 7 8 9


8

違いは、1つはリストで、もう1つはシーケンスであるということです。{1,2,3}3つの特定の要素に展開、12、と3{1..3}1〜3の数字のリストに展開します。この特定のケースでは、それらは同じであり、2つのいずれかを使用できます。file.*は、名前がで始まる現在のディレクトリ内のすべてのファイルとディレクトリに展開されますfile.。あなただけ持っている場合file.1file.2およびfile.3その後、あまりにも、他の2つのと同等であること。

その原因となる問題については、理由がわかりません。あなたは考えているかもしれません

$ cat file.* > file.txt
cat: file.txt: input file is output file

ただし、これはまったく別の問題です。私が考えることができる他の唯一の問題は、シェルが正しい順序でファイルをリストしないかもしれないということです。例えば:

$ touch file1 file11 file2
$ echo file*
file1 file11 file2

それを解決するために、zsh代わりにbash以下を使用できます(詳細については、こちらを参照)。

% echo f*(n)
file1 file2 file11

一般に、3つのアプローチは同じではありません。何をしたいかによって異なります。3つが同じ出力を返す場合、はい、それらのいずれかを使用できます。違いはありません。これらの展開はすべてシェルによって行われ、それらを使用するコマンドに渡されるに行われます。


*適切な順序に依存していれば、10個以上のファイルがあったとしても問題はありませんか?
syss

1
@syssいいえ。ARG_MAXファイルが複数ある場合は問題になりますが、それは10を超える方法です。
terdon

1
@terdon彼は、それらが引数配列をオーバーフローするかどうかではなく、数値順に(つまり、「1、10、2」ではなく)表示されるかどうかを尋ねていました。
Random832

3
@terdon @syssは、出力がcat *十分に定義されていないのが正しいと思います。出力は、シェルと環境に依存します。セバスチャンのコメントをご覧ください。
マルコ

追加し.txtても問題は解決しませんfile.*か?
イスマエルミゲル

6

それらは同じですが、利用可能な場合はインストールしたbashバージョンに依存します。

このページから:

{xxx,yyy,zzz,...} probably in all bash versions

{a..z} introduced in bash 3

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