¿Cómo hago un ls y luego ordeno los resultados por fecha de creación?

112

¿En qué orden están ordenados los fechados? Ciertamente no es un orden alfanumérico.

ls -ltordena por tiempo de modificación. Pero necesito tiempo de creación.

InquilineKea
fuente
1
Hay qué parece ser una manera de obtener el tiempo de creación de archivos en Linux si el archivo está en un sistema de archivos ext4. Ver: unix.stackexchange.com/a/131347/182996
kaartic

Respuestas:

94

La mayoría de los unices no tienen un concepto de tiempo de creación de archivos. No puede lsimprimirlo porque la información no está registrada. Si necesita tiempo de creación, use un sistema de control de versiones : defina el tiempo de creación como el tiempo de registro.

Si su variante de Unix tiene un tiempo de creación, consulte su documentación. Por ejemplo, en Mac OS X (el único ejemplo que conozco), use ls -tU. Windows también almacena un tiempo de creación, pero no siempre está expuesto a puertos de utilidades Unix, por ejemplo, Cygwin lsno tiene una opción para mostrarlo. La statutilidad puede mostrar el tiempo de creación, llamado "tiempo de nacimiento" en las utilidades de GNU, por lo que bajo Cygwin puede mostrar archivos ordenados por hora de nacimiento stat -c '%W %n' * | sort -k1n.

Tenga en cuenta que ctime ( ls -lc) no es el tiempo de creación del archivo , es el tiempo de cambio de inodo . El tiempo de cambio de inodo se actualiza cada vez que algo sobre el archivo cambia (contenido o metadatos), excepto que ctime no se actualiza cuando el archivo simplemente se lee (incluso si el atime se actualiza). En particular, el ctime siempre es más reciente que el mtime (tiempo de modificación del contenido del archivo) a menos que el mtime se haya establecido explícitamente en una fecha en el futuro.

Gilles
fuente
1
En Cygwin lo es ls -c. ls --helpmuestra qué -chace cuando se combina con -ly -lt.
Aaron D. Marasco el
66
@ Aaron No, el ctime no es el tiempo de creación. Es una confusión común basada puramente en el hecho de que "ctime" y "creación" comienzan con la misma letra, pero no hay relación entre ctime y tiempo de creación. He actualizado mi respuesta para abordar esta confusión.
Gilles
Jajaja mi mal. Estaba tratando de confirmar la parte de Cygwin para ti (IIRC tu publicación original tenía un posible comando). Dice específicamente "ctime (hora de la última modificación de la información del estado del archivo)" si hubiera prestado atención.
Aaron D. Marasco el
Agregando a @Gilles respuesta; Uso un servidor de archivos NFS 3.x (no estoy seguro sobre el sistema de archivos subyacente; es UFS o ZFS, aunque supongo que UFS). Bajo Redhat 6.x: -Uordena por tiempo de creación. En Solaris 10.x: /usr/bin/lsno admite -U, /usr/ucb/lsadmite -Uy ordena por tiempo de creación. Estos resultados obviamente dependen del sistema de archivos que almacena esa información en primer lugar.
Brian Vandenberg
1
@ghoti Si nunca se eliminaron archivos (o se movieron / cambiaron de nombre / enlazados / ...) en el directorio, entonces el orden del directorio es el orden de creación en algunos sistemas de archivos, pero no en todos. Eso no es cierto en ext4, por ejemplo. No sé si es cierto en el UFS de Solaris.
Gilles
16

Desafortunadamente, la stat(2)API no proporciona una forma de obtener el tiempo de creación del archivo, ya que no es requerido por los estándares de Unix.

Sin embargo, algunos sistemas de archivos, como ext4, guardan esta información dentro de los metadatos del archivo. Simplemente no hay una forma estándar de obtenerlo, pero hay una manera ( extsolo sistemas de archivos):

debugfs -R 'stat partition/relative/path/to/file' /dev/sda1

Obtendría algo como eso mencionar crtime( ¡ no ctime !) Si lo usa ext4.

 ctime: 0x513a50e5:d4e448f0 -- Fri Mar  8 21:58:13 2013
 atime: 0x513dd8f1:04df0b20 -- Mon Mar 11 14:15:29 2013
 mtime: 0x513a50e5:d4e448f0 -- Fri Mar  8 21:58:13 2013
crtime: 0x513a259a:35191a3c -- Fri Mar  8 18:53:30 2013

Este comando puede tardar un tiempo en volver, probablemente porque también enumera todas las extensiones relacionadas con el archivo.

Ahora, si desea ordenar los archivos por fecha de creación, supongo que esto no es fácil (ni correctamente) posible. Como dice Gilles , probablemente sería más fácil si usaras un sistema de control de revisión. Pero puede intentar echar un vistazo a la ext4API ...

Probé el stat -c '%w' myfilecomando en un ext4sistema de archivos en un sistema Ubuntu (lo suficientemente reciente) sin éxito (solo responde -).

Totor
fuente
Si alguien quiere un trazador de líneas:f='/path/to/file'; debugfs -R "stat $f" $(df $f|(read a; read a b; echo "$a"))|grep crtime
Boop
3

Aquí hay un script de Perl que usa la respuesta de Totor para lograr lo que desea (si su sistema de archivos es ext4).

Funciona en mi máquina doméstica (Ubuntu) y mi servidor (CentOS), pero no se ha probado más allá de eso, así que mmm.

#!/usr/bin/env perl

use Modern::Perl '2009';

use DateTime;


# Open the current directory for reading
opendir my $dh, "." or die "Unable to open directory: $!";

# Create a hash to save results into
my %results;
my %datestamp;

# Loop through the directory getting creation date stats for each file
while ( my $filename = readdir $dh ) {
    # Skip non-files
    next if $filename eq '.' or $filename eq '..';

    # Save the ls output for this file/directory
    $results{ $filename } = `ls -ld $filename`;

    my $stats = `debugfs -R 'stat $filename' /dev/sda6 2>/dev/null`;
    # crtime: 0x51cd731c:926999ec -- Fri Jun 28 12:27:24 2013
    $stats =~ m/crtime\: \w+\:\w+ -- (.+?)\n/s;
    my $datestring = $1;

    # Dissect date with a regexp, ick
    my %months = (
        'Jan' => '1',
        'Feb' => '2',
        'Mar' => '3',
        'Apr' => '4',
        'May' => '5',
        'Jun' => '6',
        'Jul' => '7',
        'Aug' => '8',
        'Sep' => '9',
        'Oct' => '10',
        'Nov' => '11',
        'Dec' => '12',
    );
    $datestring =~ m/\w+ (\w+)  ?(\d+) (\d\d)\:(\d\d)\:(\d\d) (\d\d\d\d)/;

    # Convert date into a more useful format
    my $dt = DateTime->new(
        year   => $6,
        month  => $months{$1},
        day    => $2,
        hour   => $3,
        minute => $4,
        second => $5,
    );

    # Save the datestamp for this result
    $datestamp{ $filename } = $dt->iso8601;
}

# Output in date order
my @filenames = sort { $datestamp{$a} gt $datestamp{$b} } keys %datestamp;

foreach my $filename ( @filenames ) {
    print $results{ $filename };
}
Denny
fuente
También es bueno mencionar que algunos archivos pueden tener metadatos (como exif) que registran la fecha / hora de creación. Si todos sus archivos son fotos digitales, por ejemplo, lo más probable es que tenga estos datos. Aquí hay un ejemplo usando Image :: ExifTool de perl .
Jonathan Cross
0

Use este comando ls -lctpara ordenar archivos según la fecha de creación.

Rohit Gaikwad
fuente
2
sí, ese no es el comando "correcto", pero es lo que estás buscando en la mayoría de los casos
madnight
¿Hay alguna manera de hacer esto con "buscar" para que imprima todos los archivos en subdirectorios de esta manera?
Colin D
El ctimetiempo de cambio es, y no crear tiempo.
Nabi KAZ