In Bash, le espansioni di caratteri jolly sono garantite in ordine?


54

L'espansione di un carattere jolly in Bash è garantita in ordine alfabetico? Sono costretto a dividere un file di grandi dimensioni in pezzi da 10 Mb in modo che possano essere accettati dal mio repository Mercurial.

Quindi stavo pensando di poter usare:

split -b 10485760 Big.file BigFilePiece.

e poi al posto di:

cat BigFile | bigFileProcessor

Potrei fare:

cat BigFilePiece.* | bigFileProcessor

al suo posto.

Tuttavia, non sono riuscito a trovare da nessuna parte ciò che garantisse che l'espansione dell'asterisco (aka jolly, aka *) sarebbe sempre stata in ordine alfabetico, quindi .aaprima .ab(al contrario di un ordine di data e ora o qualcosa del genere).

Inoltre, ci sono dei difetti nel mio piano? Quanto è grande il costo in termini di prestazioni del catfile insieme?


4
Sicuramente stai adottando un approccio sbagliato. Se l'amministratore pone un limite per la dimensione dei file che hai nel repository, allora dovresti parlare con lui. Parlando di espansione - ho sempre visto che l'espansione è alfanumerica.
Mircea Vutcovici,

1
Puoi sempre passare attraverso sortse hai bisogno di ulteriori manipolazioni dell'ordine.
Warner,

2
Nota che Mercurial può gestire file di qualsiasi dimensione, limitati dalla quantità di RAM che hai. Riceverai un avviso se aggiungi un file di grandi dimensioni, poiché Mercurial presume che possa contenere il file in memoria. Per le fusioni, Mercurial deve contenere due file in memoria. Le macchine con piccole quantità di RAM possono quindi avere problemi a estrarre il file. L'ho appena testato e hg commitsu un Nfile MB richiede circa 3 * NMB di RAM e hg updaterichiede circa 2 * NMB di RAM. Questo è con Mercurial 1.5 su Linux.
Martin Geisler,

Risposte:


67

Sì, l'espansione traumatica è alfabetica.

Dalla manpagina Bash :

Espansione percorso

Dopo la suddivisione in parole, a meno che l' -fopzione è stata impostata, bash scandisce ogni parola per i personaggi *, ?e [. Se viene visualizzato uno di questi caratteri, la parola viene considerata come un motivo e sostituita con un elenco in ordine alfabetico di nomi di file corrispondenti al motivo.


@Dennis Williamson, hai idea di cosa sarebbe ancora vero se un utente avesse una lingua diversa?
Zoredache,

5
@Zoredache: in realtà è specificato da POSIX: opengroup.org/onlinepubs/007908775/xsh/glob.html "I nomi dei percorsi sono nell'ordinamento come definito dall'impostazione corrente della categoria LC_COLLATE, vedere la specifica XBD, LC_COLLATE [ opengroup.org / onlinepubs / 007908775 / xbd /… "ed è per questo che dovresti fare cose come ls -l [[:lower:]]invece di ls -l [a-z].
Dennis Williamson,

Nota che l'ordine è alfabetico, quindi BigFilePiece.10 verrà prima di BigFilePiece.2
Ken

@DennisWilliamson - Perché due coppie di parentesi quadre? Uno sembra funzionare esattamente lo stesso per me.
ArtOfWarfare

2
@ArtOfWarfare: Prova questo: mkdir lctest; cd lctest; touch w; touch z; ls -l [:lower:]; echo =====; ls -l [[:lower:]]. Il file "z" è elencato solo dal secondo lsperché richiede nomi di file a lettera singola minuscoli. Il primo ls- quello senza parentesi quadre esterne - chiede i nomi di file a carattere singolo dall'elenco di caratteri ":", "l", "o", "w", "e" e "r". In entrambi i casi le parentesi quadre più esterne delimitano un'espressione di parentesi che elenca i caratteri e le classi. Nel caso di [[:lower:]], le parentesi quadre interne, i due punti e la parola nominano una classe di caratteri. ...
Dennis Williamson,

4

È un comportamento documentato per bashcui puoi dipendere da esso nei tuoi script. È stato anche vero per altre shell compatibili con Bourne per molto tempo ... anche se potrebbero esserci casi angolari riguardanti la piegatura delle custodie o caratteri non alfanumerici.

(L'elenco risultante, in bashsarà in un ordine quasi "ASCII-betico" --- tranne per il fatto che le lettere minuscole e maiuscole verranno raccolte insieme come se non ci fossero differenze tra maiuscole e minuscole ma con lettere minuscole confrontate prima dei loro equivalenti maiuscole. -alfabetici dovrebbero essere raggruppati nello stesso ordine in cui appaiono in ASCII).

Come altri hanno sottolineato, questo potrebbe essere disturbato dalle impostazioni dell'ambiente relative alla tua lingua: LANG in generale e LC_COLLATE in modo più specifico. Potrebbe essere più sicuro eseguire comandi che dipendono dall'ordinamento di espansione glob sotto un envcomando per cancellare l'ambiente (usando -io -ucome appropriato) o convogliare i risultati sortper garantire un sequenziamento efficace.


4
Sembra che tutti i non alfanumerici vengano ignorati nel processo di ordinamento. Quindi "=", "_", "~" non può essere utilizzato per forzare un file a iniziare o terminare (rispettivamente) l'elenco.
Otheus,

3

Mentre le espansioni glob sono ordinate alfabeticamente, obbediscono anche all'impostazione della lingua della shell.

Assicurati di impostarlo su "C" nel tuo script se intendi che sia portatile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.