GNU/Linux >> Tutoriels Linux >  >> Linux

Comment trier les noms de fichiers par ordre numérique et par ordre temporel modifié ?

Je veux joindre des fichiers pdf par pdfjoin /pdfunite /… dans l'ordre numérique bien discuté dans le fil answer linux command merge pdf files with digital sort and Modified ordre de l'heure.
Si vous utilisez la solution dans le fil, elle place l'ordre dans l'ordre numérique et l'ordre alphabétique.
Cela pose problème avec les noms de fichiers, par exemple lorsque vous voyez que les deux ont la même heure modifiée par précision à la minute mais Visceral est plus tôt à la seconde près (le navigateur de fichiers le note et met Visceral premier dans le Modified commande.

Filename               Modified
-----                  ---
3.THE ABC.pdf          10:39 
3.Visceral abc..pdf    10:39

Noms de fichiers complets

1.Description abc.pdf
2.Gabcd.pdf
3.THE ABC.pdf
3.Visceral abc..pdf
4.description of abc.pdf
5.Chraa..pdf

La proposition #1 fonctionne dans l'ordre numérique et alphabétique mais pas dans l'ordre numérique et modifié

# https://stackoverflow.com/a/23643544/54964
ls -v *.pdf | ...
    bash -c 'IFS=$'"'"'\n'"'"' read -d "" -ra x;pdfunite "${x[@]}" output.pdf'

Proposition #2 cas simplifié mais ne traite pas les espaces blancs et autres caractères spéciaux dans les noms de fichiers

# https://stackoverflow.com/a/23643544/54964
pdfunite $(ls *.pdf | sort -n) output.pdf

Il n'y a rien dans le pdfunite --help à propos de la commande donc je pense que cela devrait être fait par ls /sort /…
La commande sort n'a rien à propos de modified dans sa page de manuel.

Tester la réponse de xhienne

L'ordre n'est pas correct dans la sortie où vous voyez 2.jpg et 4.jpg sont au mauvais ordre pour une raison quelconque

[email protected]:~/Documents$ ls -tr /home/masi/Documents/[0-9]* | sort -t. -k1,1n -s
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/1.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/3.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/5.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/6.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/7.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/8.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/9.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/10.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/2.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/4.jpg

2ème itération

export LC_ALL=C; ls -tr /home/masi/Documents/[0-9]* | sort -t. -k1,1n -s

Sortie

//eadn-wc01-5196795.nxedge.io/home/masi/Documents/1.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/3.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/5.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/6.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/7.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/8.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/9.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/10.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/2.jpg
//eadn-wc01-5196795.nxedge.io/home/masi/Documents/4.jpg

Système d'exploitation :Debian 8.5

Réponse acceptée :

Vous pouvez le faire avec zsh :

zmodload zsh/stat

prefixmtime () {
sortstring=${(l:6::0:)${REPLY%%.*}}$(zstat -F '%s' +mtime -- $REPLY)
REPLY=${sortstring}
}

print -rl -- *(o+prefixmtime)

Remplacez print -rl avec votre commande si vous êtes satisfait du résultat

Comment ça marche :
Les globs seront triés ici (via o+function ) en fonction de ce que la fonction prefixmtime renvoie, c'est-à-dire sortstring qui est une chaîne obtenue en concaténant le préfixe numérique de chaque nom de fichier ${REPLY%%.*} rempli à gauche avec des zéros (l:6::0:) (en supposant que les préfixes comportent jusqu'à 6 caractères) et le mtime en secondes (obtenu via zstat module). Il peut être plus facile de comprendre comment cela fonctionne si vous exécutez :

{ for f (*)
printf '%s %s\n' ${(l:6::0:)${f%%.*}}$(zstat -F '%s' +mtime -- $f) $f
} | sort -k1,1n

Notez que ce qui précède suppose que vous êtes dans le même répertoire avec vos fichiers, sinon vous devrez définir la chaîne de tri dans cette fonction comme

sortstring=${(l:6::0:)${${REPLY##*/}%%.*}}$(zstat -F '%s' +mtime -- $REPLY)

puis vous pouvez utiliser des chemins de répertoire, par exemple

print -rl some/place/else/*(o+prefixmtime)

Linux
  1. Linux :Différence entre /dev/console , /dev/tty et /dev/tty0 ?

  2. Bash =~ Regex et Https://regex101.com/?

  3. Quelle est la portabilité de /dev/stdin, /dev/stdout et /dev/stderr ?

  4. Comment utiliser wget pour télécharger un fichier via un proxy

  5. Quand dois-je utiliser /dev/shm/ et quand dois-je utiliser /tmp/?

Linux – Fusionner /usr/bin et /usr/sbin dans /bin (gnu/linux) ?

Fichiers /proc/cpuinfo et /proc/meminfo sous Linux

Comprendre les fichiers /proc/mounts, /etc/mtab et /proc/partitions

Comment déplacer /usr et /var vers une autre partition ou un autre disque

Installer les binaires dans /bin, /sbin, /usr/bin et /usr/sbin, interactions avec --prefix et DESTDIR

Comment changer /tmp par défaut en /home/user/tmp