¿En qué orden están ordenados los fechados? Ciertamente no es un orden alfanumérico.
ls -lt
ordena por tiempo de modificación. Pero necesito tiempo de creación.
¿En qué orden están ordenados los fechados? Ciertamente no es un orden alfanumérico.
ls -lt
ordena por tiempo de modificación. Pero necesito tiempo de creación.
Respuestas:
La mayoría de los unices no tienen un concepto de tiempo de creación de archivos. No puede ls
imprimirlo 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 ls
no tiene una opción para mostrarlo. La stat
utilidad 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.
-U
ordena por tiempo de creación. En Solaris 10.x: /usr/bin/ls
no admite -U
, /usr/ucb/ls
admite -U
y ordena por tiempo de creación. Estos resultados obviamente dependen del sistema de archivos que almacena esa información en primer lugar.
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 ( ext
solo 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 ext4
API ...
Probé el stat -c '%w' myfile
comando en un ext4
sistema de archivos en un sistema Ubuntu (lo suficientemente reciente) sin éxito (solo responde -
).
f='/path/to/file'; debugfs -R "stat $f" $(df $f|(read a; read a b; echo "$a"))|grep crtime
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 };
}
Use este comando ls -lct
para ordenar archivos según la fecha de creación.
ctime
tiempo de cambio es, y no crear tiempo.