J'ai un tas de fichiers de log1
à log164
.
J'essaie de LISTER le répertoire (trié) dans un terminal UNIX mais les fonctions de tri fournissent uniquement le format suivant:
home:logs Home$ ls -1 | sort
log1.gz
log10.gz
log100.gz
log101.gz
log102.gz
log103.gz
log104.gz
log105.gz
log106.gz
...etc
Ce que je veux c'est
home:logs Home$ ls -1 | sort
log1.gz
log2.gz
log3.gz
log4.gz
log5.gz
log6.gz
log7.gz
...{more here}
log99.gz
log100.gz
log101.gz
log102.gz
...etc
Des suggestions dans ce que je pourrais utiliser pour faire ceci?
log1.gz
parlog164.gz
, alors qu'est-ce que vous devez mêmels -1
les pour?ls -1
passe: il répertorie les noms de fichiers. Puisque vous connaissiez déjà les noms de fichiers, je ne comprenais pas pourquoi vous en aviez besoin. Mais puisque tu as accepté la réponse de Kevin, je le sais maintenant: tu n'en avais pas besoin. Ce qui a plus de sens. :-)Réponses:
bash
Les accolades{}
,, les énumèrent dans l'ordre:la source
Pourquoi ne pas utiliser la
ls
fonction intégrée pour ce cas particulier, à savoir-v natural sort of (version) numbers within text
Par exemple
ls -1v log*
la source
sort
: au cas où l’on aurait un tableau de chaînes plutôt qu’un répertoire de fichiers-v - Force unedited printing of non-graphic characters
.ls | sort -n
Avec GNU ls (c'est-à-dire sur Linux, Cygwin ou d'autres systèmes sur lesquels GNU ls est spécialement installé):
En zsh:
Dans d'autres coquilles:
Remplacez
echo
parprintf '%s\n'
si vous voulez que chaque nom de fichier soit sur une ligne séparée.Si vous voulez aussi des métadonnées de fichier (
ls -l
) et que vous n'avez pas GNU ls, vous devrez appelerls
séparément pour chaque nom de fichier ou groupe de noms de fichiers que vous souhaitez voir dans l'ordre lexicographique.Pour éviter ces difficultés, utilisez suffisamment de zéros dans les noms de fichiers pour que le tri lexicographique soit adapté aux besoins de l’homme (
log001.gz
, etc.).la source
Bien que la solution
ls -1v
soit certainement la plus intéressante dans ce cas particulier, je pense qu’il est bon d’avoir également une solution qui fonctionnesort
comme dans la question initiale, car cela fonctionne également lorsque votre contribution ne vient pasls
. Dans ce cas, vous pouvez utiliser:L'
-n
option indique au tri d'effectuer un tri numérique et-k 1.4
définit la clé de tri sur le premier champ (le nom de fichier complet dans ce cas) à partir du 4ème caractère jusqu'au dernier.la source
ls -1 | sort -n -k1.4
ça ne marche pas. Il donne d'abord les caractères non triés jusqu'à 4 caractères, puis ceux triés après le 4e caractère. J'ai utilisé à lals -1 |sort | sort -n -k1.4
place et cela a fonctionné parfaitement.sort -k1.1,1.3 -k1.4n
.sort
Les mises en œuvre ne doivent pas nécessairement être stables , votre approche ne fonctionnera donc pas avec toutes les mises en œuvre. Voir aussi l'-V
option de GNU et FreeBSDsort
.GNU
sort
(tel que disponible sous Linux) dispose d’un mode de "tri par version" qui interprète les nombres à l’intérieur de non-nombres comme vous le souhaitez:De
man 1 sort
:(Création de fichiers de test vides à la liste:
touch log1.gz log2.gz log3.gz log99.gz log100.gz log101.gz log102.gz
)Votre exemple de cas, en ajoutant l'
-V
option (ou--version-sort
):la source
Si vous utilisez Mac ou BSD, essayez ceci:
la source
Ma version de Solaris ne prend pas en charge
ls -v
(grrr). Et la solution de tri fournie ci-dessus 1) requiert la connaissance de la position des chiffres dans le nom du fichier, et 2) ne gère pas des éléments tels que les numéros de version en plusieurs parties.L’approche ci-dessous est compatible avec Solaris, ne nécessite aucune connaissance préalable des positions des chiffres et gère les numéros de version avec 2, 3 ou 4 composants (comme: a-1.2, foo-5.6.7, bar_baz_9.10.11.12). Il permet également
sort -f
de plier les majuscules et les minuscules et gère correctement les répertoires mélangés à des fichiers:ls -d | sort -f -t . -k 1,1 -k 2,2n -k 3,3n -k 4,4n
Notez que cette version limite le premier composant à un seul chiffre.
Si votre système d'exploitation cible prend en charge
ls -v
cette solution, il s'agit clairement de la meilleure.la source
Solution Perl:
la source
la source
-t .
est superflu ici.Cela a fonctionné pour moi.
J'ai des fichiers 1.jpg 2.jpg ... 18.jpg
$ echo *.jpg | tr -s ' ' '\n' | sort -n
sort
devient confus avec lals
sortie en raison de caractères de couleur non imprimables. Si vous essayez ceci:ls -1 --color=none *.jpg | sort -n
cela fonctionnera parfaitement.
sort
peut ignorer les caractères non imprimables avec l'-i
option mais cela ne fonctionne toujours pas et je ne sais pas pourquoi.Mais vous pouvez toujours décaper la couleur comme ça et ça
sort
marchera:ls -1 --color=always *.jpg | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" | sort -n
J'espère qu'un jour
sort
aura une option pour cela.la source