L’expansion d’un caractère générique dans Bash est-elle garantie dans l’ordre alphabétique? Je suis obligé de scinder un fichier volumineux en fichiers de 10 Mo afin qu'ils puissent être acceptés par mon référentiel Mercurial.
Alors je pensais que je pourrais utiliser:
split -b 10485760 Big.file BigFilePiece.
puis à la place de:
cat BigFile | bigFileProcessor
Je pourrais faire:
cat BigFilePiece.* | bigFileProcessor
à sa place.
Cependant, je ne pouvais trouver aucun endroit qui garantisse que l'extension de l'astérisque (aka wildcard, aka *
) serait toujours dans l'ordre alphabétique, comme cela a .aa
été le cas auparavant .ab
(par opposition à un ordre d'horodatage ou quelque chose du genre).
Aussi, y a-t-il des défauts dans mon plan? Quel est le coût de la performance cat
du fichier ensemble?
bash
files
wildcard
large-data
Traîneau
la source
la source
sort
si vous avez besoin d'une manipulation de commande supplémentaire.hg commit
sur unN
fichier Mo, il faut environ 33 * N
Mo de RAM ethg update
environ 22 * N
Mo de RAM. Ceci est avec Mercurial 1.5 sur Linux.Réponses:
Oui, l'expansion globale est alphabétique.
De la
man
page Bash :la source
ls -l [[:lower:]]
place dels -l [a-z]
.mkdir lctest; cd lctest; touch w; touch z; ls -l [:lower:]; echo =====; ls -l [[:lower:]]
. Le fichier "z" est uniquement répertorié à la secondels
car il demande des noms de fichier minuscules à une lettre. La premièrels
- celle sans crochets - demande des noms de fichier à un caractère dans la liste de caractères ":", "l", "o", "w", "e" et "r". Dans les deux cas, les crochets les plus externes délimitent une expression entre crochets qui répertorie les caractères et les classes. Dans le cas de[[:lower:]]
, les crochets intérieurs, les deux points et le mot désignent une classe de caractères. ...C'est un comportement documenté pour
bash
que vous puissiez en dépendre dans vos scripts. C’est également le cas pour d’autres coques compatibles Bourne depuis très longtemps ... bien qu’il puisse exister des cas délicats en ce qui concerne le pliage des cas ou les caractères non alphanumériques.(La liste résultante
bash
sera dans un ordre presque "ASCII-bétique" - sauf que les lettres minuscules et majuscules seront assemblées comme s'il n'y avait pas de différences majuscules mais que les minuscules étaient rassemblées avant leurs équivalents majuscules. -les alphabètes doivent être regroupés dans le même ordre d'apparition qu'en ASCII).Comme d'autres l'ont fait remarquer, cela pourrait être perturbé par les paramètres de votre environnement linguistique: LANG en général et LC_COLLATE plus spécifiquement. Il est peut-être plus sage d’exécuter des commandes qui dépendent d’une
env
commande d’ expansion globale dans le cadre d’une commande visant à vider l’environnement (à l’aide de-i
ou-u
selon le cas) ou à diriger les résultatssort
pour garantir un séquençage robuste.la source
Bien que les développements globaux soient triés par ordre alphabétique, ils obéissent également aux paramètres de langage du shell.
Assurez-vous de définir ceci sur "C" dans votre script si vous souhaitez que cela soit portable.
la source