81 votes

Dans Bash, les expansions joker sont-elles garanties dans l'ordre ?

L'expansion d'un joker dans Bash est-elle garantie dans l'ordre alphabétique ? Je suis obligé de diviser un gros fichier en morceaux de 10 Mo pour qu'ils puissent être acceptés par mon dépôt Mercurial.

Donc je pensais que je pourrais utiliser :

split -b 10485760 Big.file BigFilePiece.

et ensuite à la place de :

cat BigFile | bigFileProcessor

Je pourrais le faire :

cat BigFilePiece.* | bigFileProcessor

à sa place.

Cependant, je n'ai pas trouvé d'endroit garantissant que l'expansion de l'astérisque (alias joker, alias * ) seraient toujours dans l'ordre alphabétique de sorte que .aa est venu avant .ab (par opposition à l'ordre d'horodatage ou quelque chose comme ça).

Y a-t-il des failles dans mon plan ? Quel est le coût de la performance de cat le dossier ensemble ?

4 votes

Il est certain que vous n'adoptez pas la bonne approche. Si l'administrateur a fixé une limite à la taille des fichiers que vous avez dans le référentiel, vous devriez lui en parler. En ce qui concerne l'expansion, j'ai toujours vu que l'expansion était alphanumérique.

1 votes

Vous pouvez toujours passer par sort si vous avez besoin de manipulations supplémentaires.

2 votes

Veuillez noter que Mercurial peut gérer des fichiers de n'importe quelle taille, limitée par la quantité de mémoire vive dont vous disposez. Vous recevrez un avertissement si vous ajoutez un gros fichier, car Mercurial suppose qu'il peut contenir le fichier en mémoire. Pour les fusions, Mercurial doit contenir deux fichiers en mémoire. Les machines disposant de peu de mémoire vive peuvent donc avoir des difficultés à extraire le fichier. Je viens de le tester, et hg commit sur un N Le fichier d'un Mo nécessite environ 3 * N MB de RAM et hg update nécessite environ 2 * N Mo de RAM. Ceci avec Mercurial 1.5 sous Linux.

101voto

jason saldo Points 5036

Oui, l'expansion du globbing est alphabétique.

Desde el Bash man page :

Expansion du nom de chemin

Après le découpage des mots, à moins que le -f a été définie, bash analyse chaque mot à la recherche des caractères * , ? y [ . Si l'un de ces caractères apparaît, alors le mot est considéré comme un motif et remplacé par une liste liste de noms de fichiers triés par ordre alphabétique correspondant au motif.

0 votes

@Dennis Williamson, Savez-vous si cela reste vrai si l'utilisateur a un jeu de langues différent ?

10 votes

@Zoredache : C'est en fait spécifié par POSIX : opengroup.org/onlinepubs/007908775/xsh/glob.html "Les noms de chemin sont triés dans l'ordre défini par le paramètre actuel de la catégorie LC_COLLATE, voir la spécification XBD, LC_COLLATE [ opengroup.org/onlinepubs/007908775/xbd/ "et c'est la raison pour laquelle vous devriez faire des choses comme ls -l [[:lower:]] au lieu de ls -l [a-z] .

1 votes

Notez que l'ordre est alphabétique, donc BigFilePiece.10 viendra avant BigFilePiece.2.

6voto

YourMomzThaBomb Points 398

Il s'agit d'un comportement documenté pour bash afin que vous puissiez en dépendre dans vos scripts. C'est également vrai pour les autres shells compatibles Bourne depuis très longtemps ... bien qu'il puisse y avoir des cas particuliers concernant le pliage de la casse ou les caractères non alphanumériques.

(La liste résultante, en bash seront dans un ordre presque "ASCII-bétique" --- sauf que les lettres minuscules et majuscules seront assemblées ensemble comme s'il n'y avait pas de différence de casse mais avec les minuscules assemblées avant leurs équivalents majuscules. Toutes les lettres non alphabétiques doivent être assemblées dans le même ordre qu'elles apparaissent en ASCII).

Comme d'autres l'ont souligné, cela peut être perturbé par les paramètres d'environnement liés à votre langue : LANG en général et LC_COLLATE plus spécifiquement. Il peut être plus sûr d'exécuter les commandes qui dépendent de l'ordre d'expansion des globes dans un environnement de type env pour effacer l'environnement (en utilisant -i o -u selon le cas) ou de faire passer les résultats par sort pour assurer un séquençage robuste.

5 votes

Il semble que tous les caractères non alphanumériques soient ignoré dans le processus de tri. Ainsi, "=", "_", "~" ne peuvent pas être utilisés pour forcer un fichier à commencer ou à terminer (respectivement) la liste.

4voto

adaptr Points 16431

Bien que les expansions glob soient triées par ordre alphabétique, elles obéissent également au paramètre de langage de Shell.

Assurez-vous de mettre la valeur "C" dans votre script si vous voulez que cela soit portable.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X