Was ist der Unterschied zwischen ls [13] und ls {1,3}?

Was ist der Unterschied zwischen ls [13] und ls {1,3}?

Ich habe mit dem Befehl drei Dateien in meinem Verzeichnis erstellt touch inv{1..3}.txt. Jetzt habe ich zwei Befehle verwendet und ihre Ausgabe ist ziemlich gleich. Diese beiden Befehle sind ls inv[13].txtund ls {1,3}.txt.

Worin unterscheiden sich diese beiden also? Worin unterscheiden sich eckige Klammern von geschweiften Klammern? Ich habe auch nach „Linux [..]“ gegoogelt, aber nichts gefunden. Könnte ich also wissen, wie diese Dinge in der Linux-Terminologie heißen?

Danke

Antwort1

  • {}wird als Klammererweiterung bezeichnet. Es gibt zwei Formen: {x..y}und {x,y}, Ersetzen von xund ydurch einen beliebigen alphabetischen oder numerischen Wert.

    In der ersten Form {x..y}wird auf alle Werte von xbis y(einschließlich) erweitert. Beispielsweise {2..5}wird auf 2, 3, 4, erweitert 5.

    In der zweiten expliziten Form wird nur zu , {x,y}erweitert . Beispielsweise wird zu und erweitert .xy{2,5}25

    Wenn keine Erweiterung möglich ist, wird das Muster wörtlich behandelt, z. B. in {a..3}.

    Wichtig zu beachten ist, dass die Klammererweiterung (falls möglich) unabhängig von einer eventuellen Dateiübereinstimmung während der Dateierstellung/-übereinstimmung durchgeführt wird.

  • []ist als Pfadnamenerweiterungsmuster (oder Globbing-Muster) bekannt. Im Gegensatz zur Klammererweiterung können Sie es nur beim Abgleichen von Dateinamen verwenden. Wenn Sie es beim Erstellen von Dateien verwenden, wird es wörtlich behandelt.

    Es gibt zwei Formen: [xyz...]und [x-y].

    In der ersten Form wird jedes einzelne Zeichen innerhalb der eckigen Klammern separat abgeglichen, d. h. jedes Zeichen wird einzeln behandelt. Für [25].txtwird also eine Datei mit dem Namen 2.txtoder 5.txtim aktuellen Verzeichnis abgeglichen, während für jede Datei mit dem Namen oder oder [245].txtabgeglichen wird .2.txt4.txt5.txt

    In der zweiten Form wird zuerst eine Bereichserweiterung durchgeführt, bevor einzeln abgeglichen wird, andernfalls wird es wörtlich behandelt. Für [2-5]. txtwird also jede Datei mit dem Namen 2.txtoder 3.txtoder 4.txtoder abgeglichen 5.txt. Wenn der Bereich nicht erweitert werden kann, wird es wörtlich behandelt, z. B. im Fall von [a-3].txt.


Ein wichtiger Verhaltensunterschied zwischen diesen beiden ist, wenn mehr Muster abgeglichen werden müssen, obwohl tatsächlich weniger abgeglichen werden. Da die Klammererweiterung auf jeden Fall durchgeführt wird, wird ein Fehler angezeigt, dass bestimmte Dateien nicht existieren, während die Pfadnamenerweiterung für den Rest alles Mögliche abgleicht, ohne dass ein Fehler auftritt:

$ 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

Hinweis zur Portabilität:

Der []Pfadnamenerweiterungsoperator wird durch POSIX definiert und ist daher zwischen der Bourne-Shell und Derivaten portierbar.

Die Klammererweiterung , {}ist nicht von POSIX definiert und daher nicht zwischen allen Shells portierbar. Beispielsweise hat dash( in Ubuntu) dies nicht. Es wurde von übernommen und funktioniert nur auf bestimmten Shells, z. B. , , , . Stellen Sie vor der Implementierung sicher, dass die von Ihnen verwendete Shell dies unterstützt.shcshbashzshksh93fish


Beispiel:

$ 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

Antwort2

Der wesentliche Unterschied zwischen den beiden Formen wird hier veranschaulicht:

$ 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].txtist ein Glob und erweitert die Liste der passenden Dateien in Ihrem Dateisystem. Dies istPfadnamenerweiterung.

inv{1,5}.txterweitert sich inv1.txtund inv5.txtunabhängig davon, welche Dateien sich tatsächlich auf Ihrem Dateisystem befinden. Dies istKlammererweiterung.

verwandte Informationen