GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo ordenar los nombres de archivo en orden numérico y orden de tiempo modificado?

Quiero unir archivos pdf por pdfjoin /pdfunite /… en el orden numérico discutido bien en el comando de linux de respuesta de hilo fusionar archivos pdf con clasificación numérica y Modificado orden de tiempo.
Si usa la solución en el hilo, pone el orden en orden numérico y orden alfabético.
Esto es problemático con los nombres de archivo, como cuando ve que ambos tienen el mismo tiempo modificado por precisión de minutos pero Visceral es anterior por segunda precisión (el navegador de archivos lo anota y pone Visceral primero en el Modified orden.

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

Nombres de archivo completos

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

La propuesta n.° 1 funciona en el orden numérico y alfabético, pero no en el orden numérico y modificado

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

La propuesta n.º 2 simplifica el caso, pero no trata los espacios en blanco y otros caracteres especiales en los nombres de archivo

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

No hay nada en el pdfunite --help sobre el pedido, así que creo que debería hacerlo ls /sort /…
El comando sort no tiene nada sobre modified en su página man.

Probando la respuesta de xhienne

El orden no es correcto en la salida donde ve 2.jpg y 4.jpg están en el orden incorrecto por alguna razón

[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

2da iteración

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

Salida

//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

SO:Debian 8.5

Respuesta aceptada:

Podrías hacer eso con zsh :

zmodload zsh/stat

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

print -rl -- *(o+prefixmtime)

Reemplazar print -rl con su comando si está satisfecho con el resultado

Cómo funciona:
Los globos se ordenarán aquí (a través de o+function ) basado en lo que la función prefixmtime devuelve, que es sortstring que es una cadena obtenida al concatenar el prefijo numérico de cada nombre de archivo ${REPLY%%.*} relleno a la izquierda con ceros (l:6::0:) (suponiendo que los prefijos tengan hasta 6 caracteres) y el mtime en segundos (obtenido a través de zstat módulo). Puede ser más fácil entender cómo funciona si ejecuta:

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

Tenga en cuenta que lo anterior supone que está en el mismo directorio que sus archivos; de lo contrario, tendrá que definir la cadena de clasificación en esa función como

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

y luego puede usar rutas de directorio, por ejemplo,

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

Linux
  1. ¿Cómo saber desde qué carpeta se está ejecutando un proceso?

  2. Linux:diferencia entre /dev/console, /dev/tty y /dev/tty0

  3. Cómo usa Linux /dev/tty y /dev/tty0

  4. hacer eco o imprimir /dev/stdin /dev/stdout /dev/stderr

  5. Cómo cambiar el valor predeterminado /tmp a /home/user/tmp

¿Cómo maneja Linux múltiples separadores de rutas consecutivas (/home////username///file)?

Archivos /proc/cpuinfo y /proc/meminfo en Linux

Comprender los archivos /proc/mounts, /etc/mtab y /proc/partitions

unix:///var/run/supervisor.sock no hay tal archivo

¿Deberían vivir los sitios web en /var/ o /usr/ según el uso recomendado?

En mi archivo /etc/hosts/ en Linux/OSX, ¿cómo hago un subdominio comodín?