Sind in Bash Platzhaltererweiterungen garantiert in Ordnung?


53

Wird die Erweiterung eines Platzhalters in Bash garantiert in alphabetischer Reihenfolge angezeigt? Ich bin gezwungen, eine große Datei in 10-MB-Teile aufzuteilen, damit sie von meinem Mercurial-Repository akzeptiert werden können.

Also dachte ich, ich könnte verwenden:

split -b 10485760 Big.file BigFilePiece.

und dann anstelle von:

cat BigFile | bigFileProcessor

Ich könnte:

cat BigFilePiece.* | bigFileProcessor

an seinem Platz.

Aber ich konnte nicht überall finden , die garantiert , dass die Erweiterung des Sternchens (auch bekannt als Platzhalter, aka *) würde immer in alphabetischer Reihenfolge, so dass .aavor kam .ab(im Gegensatz Zeitstempel Ordnung oder so ähnlich zu sein).

Gibt es auch Fehler in meinem Plan? Wie hoch sind die Leistungskosten für catdas Zusammenführen der Datei?


4
Sie gehen mit Sicherheit falsch vor. Wenn der Administrator ein Limit für die Größe der Dateien festgelegt hat, die sich im Repository befinden, sollten Sie mit ihm sprechen. Apropos Erweiterung - Ich habe immer gesehen, dass die Erweiterung alphanumerisch ist.
Mircea Vutcovici

1
Sie können jederzeit weiterleiten, sortwenn Sie zusätzliche Auftragsmanipulationen benötigen.
Warner

2
Bitte beachten Sie, dass Mercurial Dateien jeder Größe verwalten kann, begrenzt durch die Größe Ihres Arbeitsspeichers. Sie erhalten eine Warnung, wenn Sie eine große Datei hinzufügen, da Mercurial davon ausgeht, dass sie die Datei im Speicher halten kann. Für Zusammenführungen muss Mercurial zwei Dateien im Speicher halten. Computer mit wenig RAM können daher Probleme beim Auschecken der Datei haben. Ich habe es gerade getestet und hg commitfür eine NMB-Datei sind ungefähr 3 * NMB RAM und hg updateungefähr 2 * NMB RAM erforderlich . Dies ist mit Mercurial 1.5 unter Linux.
Martin Geisler

Antworten:


67

Ja, die Globbing-Erweiterung ist alphabetisch.

Von der Bash- manSeite:

Pfadnamenerweiterung

Nach dem Wort Spaltung, es sei denn , die -fOption festgelegt wurde, scannt bash jedes Wort für die Charaktere *, ?und [. Wenn eines dieser Zeichen angezeigt wird, wird das Wort als Muster angesehen und durch eine alphabetisch sortierte Liste von Dateinamen ersetzt, die mit dem Muster übereinstimmen.


@ Tennis Williamson, Irgendeine Idee, ob dies immer noch zutrifft, wenn ein Benutzer eine andere Sprache eingestellt hat?
Zoredache

5
@Zoredache: Es wird tatsächlich von POSIX angegeben: opengroup.org/onlinepubs/007908775/xsh/glob.html "Die Pfadnamen sind in der Sortierreihenfolge, die durch die aktuelle Einstellung der Kategorie LC_COLLATE definiert wird, siehe XBD-Spezifikation LC_COLLATE [ opengroup.org / onlinepubs / 007908775 / xbd /… "und deshalb sollten Sie Dinge wie ls -l [[:lower:]]anstelle von tun ls -l [a-z].
Dennis Williamson

Beachten Sie, dass die Reihenfolge alphabetisch ist, sodass BigFilePiece.10 vor BigFilePiece.2
Ken,

@DennisWilliamson - Warum zwei Paar eckige Klammern? Man scheint mir genau so zu arbeiten.
ArtOfWarfare

2
@ArtOfWarfare: Versuchen Sie folgendes: mkdir lctest; cd lctest; touch w; touch z; ls -l [:lower:]; echo =====; ls -l [[:lower:]]. Die "z" -Datei wird nur im Sekundentakt aufgelistet, lsda sie nach Dateinamen in Kleinbuchstaben fragt. Die erste ls- die ohne die äußeren eckigen Klammern - fragt nach Dateinamen mit einzelnen Zeichen aus der Liste der Zeichen ":", "l", "o", "w", "e" und "r". In beiden Fällen begrenzen die äußersten eckigen Klammern einen Klammerausdruck, in dem Zeichen und Klassen aufgelistet sind. Im Fall von [[:lower:]]bezeichnen die inneren eckigen Klammern, Doppelpunkte und das Wort eine Zeichenklasse. ...
Dennis Williamson

4

Es ist ein dokumentiertes Verhalten, bashauf das Sie sich in Ihren Skripten verlassen können. Dies gilt auch für andere Bourne-kompatible Shells seit sehr langer Zeit ... obwohl es Eckfälle in Bezug auf Groß- / Kleinschreibung oder nicht-alphanumerische Zeichen geben kann.

(Die resultierende Liste bashin ist fast "ASCII-konform" - mit der Ausnahme, dass Klein- und Großbuchstaben so zusammengestellt werden, als gäbe es keine Unterschiede zwischen Groß- und Kleinbuchstaben, jedoch mit Kleinbuchstaben, die vor den entsprechenden Großbuchstaben stehen. Alle nicht -Alphabetiker sollten in derselben Reihenfolge wie in ASCII sortiert sein.

Wie andere darauf hingewiesen haben, kann dies durch Ihre sprachbezogenen Umgebungseinstellungen gestört werden: LANG im Allgemeinen und LC_COLLATE im Besonderen. Am sichersten ist es möglicherweise, Befehle auszuführen, die von der Glob-Erweiterungsreihenfolge unter einem envBefehl abhängen , um die Umgebung zu löschen (mit -ioder -unach Bedarf) oder die Ergebnisse weiterzuleiten sort, um eine zuverlässige Sequenzierung zu gewährleisten.


4
Es scheint, dass alle nicht-alphanumerischen Zeichen beim Sortiervorgang ignoriert werden. "=", "_", "~" Kann also nicht verwendet werden, um zu erzwingen, dass eine Datei die Liste startet bzw. beendet.
Otheus

3

Glob-Erweiterungen sind zwar alphabetisch sortiert, beachten jedoch auch die Spracheinstellung der Shell.

Stellen Sie sicher, dass dies in Ihrem Skript auf "C" gesetzt ist, wenn dies portabel sein soll.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.