J'ai un répertoire rempli de fichiers avec des noms comme logXX
XX où est un nombre hexadécimal majuscule et zéro à deux caractères, tel que:
log00
log01
log02
...
log0A
log0B
log0C
...
log4E
log4F
log50
...
Généralement, il y aura moins de 20 ou 30 fichiers au total. On ne peut pas compter sur la date et l’heure de mon système particulier (système intégré sans sources de temps NTP ou GPS fiables). Cependant, les noms de fichiers seront incrémentés de manière fiable, comme indiqué ci-dessus.
Je souhaite grep
parcourir tous les fichiers de la dernière entrée de journal d'un certain type, j'espérais pouvoir cat
les regrouper, tels que ...
cat /tmp/logs/log* | grep 'WARNING 07 -' | tail -n1
Cependant, il m'est apparu que différentes versions de bash
or sh
ou zsh
etc. pouvaient avoir des idées différentes sur la manière dont elles *
sont développées.
La man bash
page ne dit pas si le développement de *
serait une liste alphabétique définitivement ascendante des noms de fichiers correspondants. Il semble que chaque fois que je l’essaye, tous les systèmes dont je dispose sont en hausse, mais est-ce un comportement DEFINED ou une implémentation spécifique?
En d’autres termes, puis-je absolument compter sur la cat /tmp/logs/log*
concaténation de tous mes fichiers journaux dans l’ordre alphabétique?
sort
est le même que celui utilisé pour le shell lorsqu'il étend un modèle de définition de nom de fichier.cat
avecgrep -h pattern /tmp/logs/log*
pour supprimer les noms de fichiers préfixer aux matchs. (Au moins avec GNU grep, je n'ai pas vérifié POSIX ou busybox.)cat
, c'est une utilisation inutile desort
Réponses:
Dans tous les shells, les globs sont triés par défaut. Ils étaient déjà par l'
/etc/glob
assistant appelé par la coquille de Ken Thompson pour développer des globs dans la première version d'Unix au début des années 70 (et qui a donné leur nom à globs).En effet
sh
, POSIX exige qu’ils soient triés par le biais destrcoll()
l’ordre de tri dans les paramètres régionaux de l’utilisateur, comme c’est le cas pourls
certains, maisstrcmp()
uniquement via les valeurs d’octets.Vous remarquerez peut-être ci-dessus que pour les shells qui effectuent un tri en fonction de la locale, ici sur un système GNU avec une
en_GB.UTF-8
locale, le-
nom des fichiers est ignoré pour le tri (la plupart des caractères de ponctuation le seraient). Leó
est trié de manière plus attendue (au moins pour les Britanniques), et le cas est ignoré (sauf quand il s'agit de décider des liens).Cependant, vous remarquerez des incohérences dans log① log②. En effet, l'ordre de tri de et n'est pas défini dans les paramètres régionaux GNU (actuellement; espérons-le, il sera corrigé un jour). Ils trient la même chose, vous obtenez donc des résultats aléatoires.
Changer les paramètres régionaux affectera l'ordre de tri. Vous pouvez définir les paramètres régionaux sur C pour obtenir un
strcmp()
tri de type:Notez que certains paramètres régionaux peuvent causer des confusions, même pour les chaînes tout-ASCII tout-alnum. Comme les Tchèques (du moins sur les systèmes GNU) où se
ch
trouve un élément de classement qui trie aprèsh
:Ou, comme l'a souligné @ninjalj, même les plus bizarres dans les localités hongroises:
Dans
zsh
, vous pouvez choisir le tri avec les qualificatifs glob . Par exemple:Le tri numérique
echo *(n)
peut également être activé globalement avec l'numericglobsort
option:Si vous (comme j’étais) confus par cet ordre dans ce cas particulier (ici, en utilisant mes paramètres régionaux britanniques), cliquez ici pour plus de détails.
la source
&C<cs<<<Cs<<<CS
, while&C<cs<<<cS<<<Cs<<<CS
est marqué comme projet expérimental. À en juger par certaines données plus anciennes importées dans CLDR, les anciennes versions AIX et MS semblaient préférer la vue "minuscules puis majuscules sont deux éléments de classement différents".La page de manuel de bash spécifie:
la source
man
rendu du texte, mastic ou ... Juste maximisé mon terminal et lebash
. Tho OP était également intéressé par "zsh etc."À moins que vous ne déclenchiez des options de shell très spécifiques dans certains shells, le résultat obtenu est identique.
La commande est spécifiée dans le standard POSIX :
Voir aussi la catégorie LC_COLLATE dans la locale POSIX , qui dit en bref que si
LC_COLLATE=C
, alors les choses sont ordonnées dans l'ordre ASCII.Le
bash
manuel mentionneksh93
etzsh
a une formulation similaire, ce qui me porte à croire qu'ils suivent la norme POSIX à cet égard.D'autres shells, comme
pdksh
etdash
ne disent rien sur le tri des noms de fichiers résultant de la suppression de nom de fichier. Je suis tenté de croire que cela signifie qu'ils respectent toujours la même norme, du moins lorsqu'ils utilisent les paramètres régionaux POSIX. D'après mon expérience, je n'ai pas rencontré de shell qui effectue un tri ouvertement "étrange" des noms de fichiers ASCII.la source
numericglobsort
option danszsh
qui affecterait le tri. Cependant, je préférerais l'activerecho *(n)
globalement, plutôt que d'activer l'option globalement.--posix
option de ligne de commande ou exécuterset -o posix
posix
mode de Bash . Voir gnu.org/software/bash/manual/html_node/Bash-POSIX-Mode.html Cela m'amène à croire (espérons plutôt) que le tri est conforme à POSIX.Si l’objectif principal est de trier les fichiers d’entrée par leur âge, en commençant par le plus vieux, vous pouvez écrire
Et si les journaux tournés et compressés sont également impliqués:
la source