Vraag Zijn Wildcard-uitbreidingen in Bash gegarandeerd in orde?


Is de uitbreiding van een wildcard in Bash gegarandeerd in alfabetische volgorde? Ik ben genoodzaakt om een ​​groot bestand in stukken van 10 MB te splitsen, zodat ze door mijn Mercurial-repository kunnen worden geaccepteerd.

Dus ik dacht dat ik kon gebruiken:

split -b 10485760 Big.file BigFilePiece.

en dan in plaats van:

cat BigFile | bigFileProcessor

Ik zou kunnen doen:

cat BigFilePiece.* | bigFileProcessor

op zijn plaats.

Ik kon echter nergens vinden dat garandeerde dat de uitbreiding van de asterisk (aka wildcard, aka *) zou altijd in alfabetische volgorde staan .aa kwam eerder .ab (in tegenstelling tot tijdstempel bestellen of iets dergelijks).

Zijn er ook fouten in mijn plan? Hoe groot zijn de prestatiekosten van cathet bestand samen?


44
2018-03-15 19:47


oorsprong


Zeker, je neemt de verkeerde benadering. Als de beheerder een limiet heeft ingesteld voor de grootte van bestanden die je in de repository hebt, moet je met hem praten. Over expansie gesproken - ik heb altijd gezien dat de uitbreiding alfanumeriek is. - Mircea Vutcovici
Je kunt er altijd doorheen sort als u extra ordermanipulatie nodig heeft. - Warner
Houd er rekening mee dat Mercurial bestanden van elke grootte kan beheren, beperkt door de hoeveelheid RAM die u hebt. U krijgt een waarschuwing als u een groot bestand toevoegt, omdat Mercurial ervan uitgaat dat het bestand in het geheugen kan worden bewaard. Voor samenvoegingen moet Mercurial twee bestanden in het geheugen opslaan. Machines met kleine hoeveelheden RAM kunnen daarom problemen hebben met het uitchecken van het bestand. Ik heb het net getest, en hg commitop een N MB-bestand vereist ongeveer 3 * N MB RAM en hg update vereist ongeveer 2 * N MB RAM. Dit is met Mercurial 1.5 op Linux. - Martin Geisler


antwoorden:


Ja, wereldwijde uitbreiding is alfabetisch.

Van de Bash man pagina:

Uitbreiding van padnaam

Na woordsplitsing, tenzij de -f optie is ingesteld, bash-scans       elk woord voor de personages *, ?, en [. Als een van deze tekens       verschijnt, dan wordt het woord beschouwd als een patroon en vervangen door een       alfabetisch gesorteerde lijst van bestandsnamen die overeenkomen met het patroon.


59
2018-03-15 20:07



@Dennis Williamson, enig idee of dit nog steeds waar zou zijn als een gebruiker een andere taal heeft ingesteld? - Zoredache
@Zoredache: het wordt feitelijk gespecificeerd door POSIX: opengroup.org/onlinepubs/007908775/xsh/glob.html "De padnamen zijn in sorteervolgorde zoals gedefinieerd door de huidige instelling van de LC_COLLATE-categorie, zie de XBD-specificatie, LC_COLLATE [opengroup.org/onlinepubs/007908775/xbd/...en daarom zou je dingen moeten doen ls -l [[:lower:]] in plaats van ls -l [a-z]. - Dennis Williamson
Merk op dat de volgorde alfabetisch is, dus BigFilePiece.10 komt voor BigFilePiece.2 - Ken
@ DennisWilliamson - Waarom twee paren vierkante haakjes? Eén lijkt precies hetzelfde te werken voor mij. - ArtOfWarfare
@ArtOfWarfare: probeer dit: mkdir lctest; cd lctest; touch w; touch z; ls -l [:lower:]; echo =====; ls -l [[:lower:]]. Het "z" -bestand wordt alleen weergegeven per seconde ls omdat het vraagt ​​om kleine lettertypen met bestandsnamen. De eerste ls - degene zonder de buitenste vierkante haakjes - vraagt ​​om bestandsnamen met één teken uit de lijst met tekens ":", "l", "o", "w", "e" en "r". In beide gevallen begrenzen de buitenste vierkante haken een haakse uitdrukking die tekens en klassen bevat. In het geval van [[:lower:]], de binnenste vierkante haakjes, dubbele punten en woordnaam een ​​tekenklasse. ... - Dennis Williamson


Het is gedocumenteerd gedrag voor bash zodat je er op kunt vertrouwen in je scripts. Het gold ook al heel lang voor andere Bourne-compatibele shells ... hoewel er hoekcases kunnen zijn met betrekking tot het vouwen van vouwen of niet-alfanumerieke tekens.

(De resulterende lijst, in bash zal in bijna "ASCII-betical" volgorde zijn - behalve dat hoofdletters en kleine letters samen worden verzameld alsof er geen verschillen van zaak zijn, maar met kleine letters gesorteerd voor hun hoofdletter-equivalenten. Alle niet-alfabetische woorden moeten in dezelfde volgorde worden gesorteerd als ze in ASCII worden weergegeven).

Zoals anderen hebben opgemerkt, kan dit verstoord worden door uw taalgerelateerde omgevingsinstellingen: LANG in het algemeen en LC_COLLATE specifieker. In misschien wel het veiligst om opdrachten uit te voeren die afhankelijk zijn van glob-uitbreidingsopdrachten onder een env opdracht om de omgeving te wissen (met -i of -u indien van toepassing) of om de resultaten door te spuiten sort om robuuste sequencing te garanderen.


2
2018-03-16 04:51



Het lijkt erop dat alle niet-alfanumerieke tekens zijn genegeerd in het sorteerproces. Dus "=", "_", "~" kunnen niet worden gebruikt om een ​​bestand te dwingen de lijst te starten of te eindigen (respectievelijk). - Otheus


Hoewel globale uitbreidingen alfabetisch zijn gesorteerd, zijn ze ook in overeenstemming met de taalinstelling van de shell.

Zorg ervoor dat u dit in script instelt op "C" als u van plan bent dit draagbaar te maken.


1
2018-01-20 12:23