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 $idir
parte 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, sed
la 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 \n
y \0
llamando sort
con la -z
opción. Ah, y deja las sed
llamadas indirectas; tenga en cuenta que su secuencia de comandos no funcionará si $idir
contiene 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 om
clasifica los archivos por antigüedad (úselo Om
para 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)