ls [13]とls {1,3}の違いは何ですか?


11

コマンドを使用して、ディレクトリに3つのファイルを作成しましたtouch inv{1..3}.txt。ここで、2つのコマンドを使用しましたが、それらの出力はほとんど同じです。これらの2つのコマンドはあるls inv[13].txtls {1,3}.txt

それでは、これら2つはどう違うのでしょうか?中かっこと比較して角かっこはどう違いますか?また、「linux [..]」を探していましたが、何も見つかりませんでした。そのため、これらの用語がLinux用語で何と呼ばれているのかを知ることができましたか?

ありがとう


2
この名前は「ファイル名展開」または「グロビング」です。
バイトコマンダー

これらのうち、ファイル名の拡張またはグロビングはどれですか?角かっこ([..])または花かっこ({..})ですか?
posixKing

回答:


14
  • {}ブレース拡張と呼ばれます。これは、2つの形式があります{x..y}{x,y}、交換するxy任意のアルファベットや数字の値を持ちます。

    最初の形式で{x..y}は、からxまでのすべての値に展開されますy。たとえば、{2..5}に展開されます2345

    2番目の明示的な形式で{x,y}は、のみxに展開されyます。たとえば、{2,5}に展開されます25

    展開できない場合、パターンは文字どおりに処理され{a..3}ます(例:)。

    注意すべき重要なことは、ファイルの作成/照合中に、ファイルの一致に関係なく、ブレースの展開が(可能であれば)行われることです。

  • []パス名拡張(またはグロビング)パターンとして知られています。中括弧の展開とは異なり、ファイル名の一致中にのみ使用できますが、ファイルの作成中に使用する場合は文字通り処理されます。

    には2つの形式が[xyz...]あり[x-y]ます。

    最初の形式では、角括弧内の任意の単一文字と個別に一致します。つまり、各文字は個別に処理されます。だから、のために[25].txt、それは名前のファイルに一致します2.txt5.txtについてながら、現在のディレクトリにし[245].txt、それが名前の任意のファイルと一致します2.txt4.txtまたはを5.txt

    2番目の形式では、可能であれば文字通りに処理される場合、個別に一致する前に最初に範囲拡張が行われます。そのため[2-5]. txt2.txtor 3.txtまたは4.txtor という名前のファイルに一致します5.txt。範囲を拡張できない場合、文字どおりに処理されます(例:の場合)[a-3].txt


これら2つの重要な動作上の違いは、実際に一致するパターンは少なく、一致するパターンが多い場合です。括弧の展開は何があっても行われるため、特定のファイルが存在しないというエラーが表示されますが、パス名の展開は残りのエラーなしで可能な限り一致します:

$ ls {1..4}.txt
ls: cannot access 4.txt: No such file or directory
1.txt  2.txt  3.txt

$ ls [1-4].txt
1.txt  2.txt  3.txt

移植性に関する注意:

[]パス名展開オペレータは、Bourneシェルおよび誘導体のうち、従ってポータブルPOSIXによって定義されます。

中括弧の展開{}はPOSIXによって定義されていないため、すべてのシェル間で移植できません。たとえば、 dashshUbuntuでは)これはありません。それはから借りたcshだけ例えば、特定のシェル上で動作しますbashzshksh93fish。実装する前に、使用しているシェルがこれをサポートしていることを確認してください。


例:

$ touch {1..3}.txt

$ ls {1..3}.txt
1.txt  2.txt  3.txt

$ ls {1,2,3}.txt
1.txt  2.txt  3.txt

$ ls {1..4}.txt
ls: cannot access 4.txt: No such file or directory
1.txt  2.txt  3.txt

$ ls {a..3}.txt
ls: cannot access {a..3}.txt: No such file or directory

$ ls [123].txt
1.txt  2.txt  3.txt

$ ls [1-3].txt
1.txt  2.txt  3.txt

$ ls [1-4].txt
1.txt  2.txt  3.txt

$ ls [a-3].txt
ls: cannot access [a-3].txt: No such file or directory

1
[ ]一致しない場合、展開の動作に依存することは避けてください。これは、シェルの構成によって異なる場合があるためです。[または]ファイル名で使用する場合は、コマンドで引用符で囲む必要があります。それはまたの間の違いに気付いて価値がある{13..79}[13-79]。範囲内のすべての数値を生成する第一1379、第二の文字にマッチする134567、および9
カスペルド

@kasperdはい、それがnullglob(または同様の)目的です。[13-79]マッチングについては、[] `の文字ごとの動作についての回答で明確に言及したと思います。
-heemayl

@heemayl `{1..3}`形式はバシズムであることも言及する価値があると思います。これはダッシュでは機能しません。私が思うにksh、この機能を持っていますが、ではない、それはmkshとpkdshのような、より近代的な味をだ
Sergiy Kolodyazhnyy

@Serg移植性に関する注記を追加。
-heemayl

7

2つの形式の主な違いを次に示します。

$ ls inv[15].txt
inv1.txt
$ ls inv{1,5}.txt
ls: cannot access 'inv5.txt': No such file or directory
inv1.txt

inv[15].txtはグロブであり、ファイルシステム上の一致するファイルのリストを展開します。これがパス名展開です。

inv{1,5}.txt展開inv1.txtし、inv5.txt関係なく、ファイルがファイルシステム上に実際にあるものを。これはブレースの拡張です。


もう1つの重要な違いは、記述できることba{con,tman}と、角括弧を使用した同等物がないことです。IOW、ブレースの展開は単一の文字だけではありません。
ホッブズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.