¿Algún método mejor que este para ordenar archivos por fecha de creación?

¿Algún método mejor que este para ordenar archivos por fecha de creación?

Necesitaba mostrar una lista de directorios ordenados por fecha de creación y se me ocurrió este fragmento de código que me pareció bastante inteligente. ¿Existe una forma más obvia de hacer esto que me falta?

printf "%-20s\t\t\t%-s\n" "DATE" "CASE"
printf "%-20s\t\t\t%-s\n" "----" "----"

find $idir -mindepth 3 -maxdepth 3 -type d -printf "%T@ %Tc\t\t%p\n" \
     | sed "s#${idir}/##" \
     | sort -h \
     | sed "s#^[^ ]* ##"

Salida de muestra

DATE                                    CASE
----                                    ----
Fri 06 Sep 2013 11:17:41 AM EDT         dir1/Baseline/2013_09_06_11_16_10
Fri 06 Sep 2013 01:44:38 PM EDT         dir2/Baseline/2013_09_06_13_42_48
Sun 08 Sep 2013 05:02:46 PM EDT         dir3/6 Month/2013_09_08_17_02_05
Fri 13 Sep 2013 02:28:30 PM EDT         dir4/Baseline/2013_09_13_14_25_09

Detalles

Lo anterior se verá exactamente a 3 directorios de profundidad del directorio $idir. Luego imprime la hora de creación de cualquier directorio que se encuentre a esta profundidad. Luego elimino la $idirparte de la ruta de la salida (no la necesito), la clasifico y luego corto la %T@parte de la salida. Esto fue solo para poder ordenar más fácilmente la salida.

Sin el final, sedla salida se ve así:

DATE                                    CASE
----                                    ----
1378480661.2612650000 Fri 06 Sep 2013 11:17:41 AM EDT           dir1/Baseline/2013_09_06_11_16_10
1378489478.3223970000 Fri 06 Sep 2013 01:44:38 PM EDT           dir2/Baseline/2013_09_06_13_42_48
1378674166.7427782000 Sun 08 Sep 2013 05:02:46 PM EDT           dir3/6 Month/2013_09_08_17_02_05
1379096910.4431689000 Fri 13 Sep 2013 02:28:30 PM EDT           dir4/Baseline/2013_09_13_14_25_09

¡Mostrandome un método más limpio!

Respuesta1

No existe un método bueno y portátil para ordenar archivos por fecha. Los métodos más portátiles son:

  • Si puede suponer que los nombres de archivos contienen sólo caracteres imprimibles, llame a ls -ltd.
  • De lo contrario, utilice Perl.

Este es el método clásico para ordenar archivos por fecha con herramientas GNU. Estás asumiendo que los nombres de los archivos no contienen ninguna nueva línea; Esto se soluciona fácilmente cambiando \ny \0llamando sortcon la -zopción. Ah, y deja las sedllamadas indirectas; tenga en cuenta que su secuencia de comandos no funcionará si $idircontiene alguno de ellos #*^$\[porque sed los interpretará como caracteres especiales.

cd "$idir" &&
find -mindepth 3 -maxdepth 3 -type d -printf '%T@ %Tc\t\t%p\0' |
sort -hz |
tr '\0\n' '\n\0' |
sed 's/^[^ ]* //'

Por cierto, estás ordenando los archivos por hora de modificación, no por hora de creación. La mayoría de las variantes de Unix distintas de OSX no admiten tiempos de creación en su totalidad (desde el sistema de archivos, pasando por el kernel hasta las herramientas del usuario).

La forma fácil y limpia de ordenar archivos por hora de modificación es utilizar zsh. El calificador global omclasifica los archivos por antigüedad (úselo Ompara obtener primero el archivo más antiguo).

files=(*(om))
echo "The oldest file is $files[-1]"

Para obtener un resultado como el que muestra, puede usarzstat.

zmodload zsh/stat
describe () {
  typeset -A st
  zstat -s -H st "$REPLY"
  echo "$st[mtime] $REPLY"
}
: */*/*(/+describe)

información relacionada