44 votes

En bash, comment trier des chaînes de caractères contenant des chiffres ?

Si j'ai ces fichiers dans un répertoire

cwcch10.pdf
cwcch11.pdf
cwcch12.pdf
cwcch13.pdf
cwcch14.pdf
cwcch15.pdf
cwcch16.pdf
cwcch17.pdf
cwcch18.pdf
cwcch1.pdf
cwcch2.pdf
cwcch3.pdf
cwcch4.pdf
cwcch5.pdf
cwcch6.pdf
cwcch7.pdf
cwcch8.pdf
cwcch9.pdf

comment puis-je les lister en Bash de sorte qu'ils soient dans l'ordre numérique croissant en fonction de la partie numérique de la chaîne. Ainsi, l'ordre résultant est cwcch1.pdf, cwcch2.pdf, ..., cwcch9.pdf, cwcch10.pdf, etc.

Mon objectif final est de concaténer les PDF avec pdftk avec quelque chose comme ce qui suit

pdftk `ls *.pdf | sort -n` cat output output.pdf

mais cela ne fonctionne pas car mon tri est incorrect.

72voto

Damian Powell Points 315

Votre tri peut avoir la possibilité de le faire pour vous :

tri --version-sort

33voto

WingManEXE Points 611

Pour cet exemple particulier, vous pourriez également faire ceci :

ls *.pdf | sort -k2 -th -n

C'est-à-dire, trier numériquement (-n) sur le deuxième champ (-k2) en utilisant 'h' comme séparateur de champ (-th).

9voto

retracile Points 3106

Quelque chose comme ça pourrait faire ce que vous voulez, même si cela prend une approche légèrement différente :

pdftk $(for n in {1..18}; do echo cwcch$n.pdf; done) cat output output.pdf

8voto

Vous pouvez utiliser l'option -v dans GNU ls : tri naturel des nombres (de version) dans le texte.

ls -1v cwcch*

Cela ne fonctionne pas avec ls de BSD (par exemple sur OS X), où l'option -v a une signification différente.

2voto

user12786 Points 454

Utilisez l'expansion du shell directement dans une ligne de commande. L'expansion devrait les ordonner correctement. Si je comprends bien la syntaxe de la ligne de commande de pdftk, voici ce que vous devez faire :

# expansion shell avec des crochets
pdftk cwcch[1-9].pdf cwcch1[0-9].pdf cat output output.pdf

# expansion shell avec des accolades
pdftk cwcch{{1..9},{10..18}}.pdf cat output output.pdf

Ou vous pouvez essayer une approche différente. Quand j'ai besoin de faire quelque chose comme ça, j'essaie généralement de formater mes chiffres correctement à l'avance. Si je m'en occupe tardivement et que les PDF sont déjà numérotés comme dans votre exemple, j'utiliserai ceci pour les renommer :

# rename est rename.pl alias prename -- script de renommage perl
# cela ajoute un zéro en tête des chiffres à un seul chiffre
rename 's/(\d)/0$1/' cwcch[1-9].pdf

Maintenant le tri standard de ls fonctionnera correctement.

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