it-swarm.com.de

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

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

Wie unterscheiden sich diese beiden? Wie unterscheiden sich eckige Klammern von Klammern? Ich habe auch nach "Linux [..]" gegoogelt, konnte aber nichts finden. Könnte ich wissen, wie diese Dinge in der Linux-Terminologie heißen?

Vielen Dank

11
posixKing
  • {} heißt Klammererweiterung. Es gibt zwei Formen: {x..y} und {x,y}, ersetzen Sie x und y durch einen beliebigen alphabetischen oder numerischen Wert.

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

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

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

    Es ist wichtig zu beachten, dass die Erweiterung der geschweiften Klammer (falls möglich) unabhängig von einer Dateiübereinstimmung durchgeführt wird, während die Datei erstellt/abgeglichen wird.

  • [] ist als Pfadnamen-Erweiterungsmuster (oder Globbing-Muster) bekannt. Im Gegensatz zur geschweiften Klammer können Sie sie nur verwenden, wenn Sie Dateinamen abgleichen. Sie werden jedoch wörtlich behandelt, wenn Sie sie beim Erstellen von Dateien verwenden.

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

    In der ersten Form wird jedes einzelne Zeichen in den eckigen Klammern separat zugeordnet, d. H. Jeder Charakter wird individuell behandelt. Für [25].txt entspricht es einer Datei mit dem Namen 2.txt oder 5.txt im aktuellen Verzeichnis, während es für [245].txt einer beliebigen Datei mit dem Namen 2.txt oder 4.txt oder 5.txt.

    In der zweiten Form wird zuerst eine Bereichserweiterung durchgeführt, bevor eine individuelle Anpassung vorgenommen wird, wenn möglich, wird dies wörtlich anders behandelt. Für [2-5]. txt entspricht es also jeder Datei mit dem Namen 2.txt oder 3.txt oder 4.txt oder 5.txt. Wenn der Bereich nicht erweitert werden kann, wird er wörtlich behandelt, z. im Falle von [a-3].txt.


Ein wichtiger Unterschied zwischen diesen beiden Verhaltensweisen besteht darin, dass mehr Muster abgeglichen werden müssen, während weniger tatsächlich abgeglichen werden. Da die Erweiterung der geschweiften Klammern durchgeführt wird, wird der Fehler angezeigt, dass bestimmte Dateien nicht vorhanden sind, während die Pfadnamenerweiterung im Übrigen nach Möglichkeit fehlerfrei ist:

$ 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 von POSIX definiert und ist daher in Bourne Shell und Derivaten portierbar.

Die Klammererweiterung {} wird von POSIX nicht definiert und ist daher nicht für alle Shells portierbar. Zum Beispiel hat dash (sh in Ubuntu) dies nicht. Es wurde von csh ausgeliehen und funktioniert nur mit bestimmten Shells, z. bash, zsh, ksh93, fish. Stellen Sie vor der Implementierung sicher, dass die von Ihnen verwendete Shell dies unterstützt.


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
14
heemayl

Der Hauptunterschied zwischen den beiden Formen ist hier dargestellt:

$ 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 ist ein Glob und erweitert die Liste der übereinstimmenden Dateien in Ihrem Dateisystem. Dies ist Pfadnamenerweiterung.

inv{1,5}.txt wird zu inv1.txt und inv5.txt erweitert, unabhängig davon, welche Dateien sich tatsächlich in Ihrem Dateisystem befinden. Dies ist Klammererweiterung.

7
John1024