Dans quel ordre les dates sont-elles commandées? Ordre certainement pas alphanumérique.
ls -lt
trie par heure de modification. Mais j'ai besoin de temps de création.
Dans quel ordre les dates sont-elles commandées? Ordre certainement pas alphanumérique.
ls -lt
trie par heure de modification. Mais j'ai besoin de temps de création.
Réponses:
La plupart des ordinateurs n'ont pas de concept de création de fichier. Vous ne pouvez pas faire ls
imprimer car les informations ne sont pas enregistrées. Si vous avez besoin d’heure de création, utilisez un système de contrôle de version : définissez l’heure de création comme heure d’enregistrement.
Si votre variante unix a une heure de création, consultez sa documentation. Par exemple, sur Mac OS X (le seul exemple que je connaisse¹), utilisez ls -tU
. Windows stocke également une heure de création, mais il n'est pas toujours exposé aux ports des utilitaires Unix, par exemple, Cygwin ls
n'a pas l'option de l'afficher. L' stat
utilitaire peut afficher l'heure de création, appelée "heure de naissance" dans les utilitaires GNU. Ainsi, sous Cygwin, vous pouvez afficher les fichiers triés par heure de naissance avec stat -c '%W %n' * | sort -k1n
.
Notez que ctime ( ls -lc
) n'est pas l'heure de création du fichier , c'est l' heure de changement d' inode . L'heure de changement d'inode est mise à jour chaque fois que quelque chose concernant le fichier change (contenu ou métadonnées), à l'exception du fait que le temps ctime n'est pas mis à jour lorsque le fichier est simplement lu (même si atime est mis à jour). En particulier, ctime est toujours plus récent que mtime (heure de modification du contenu du fichier), sauf si mtime a été explicitement défini sur une date ultérieure.
-U
trie par heure de création. Sous Solaris 10.x: /usr/bin/ls
ne prend pas en charge -U
, /usr/ucb/ls
prend en charge -U
et trie par date de création. Ces résultats dépendent évidemment du système de fichiers stockant ces informations en premier lieu.
Malheureusement, l’ stat(2)
API ne permet pas d’obtenir l’heure de création du fichier, car elle n’est pas exigée par les normes Unix.
Cependant, certains systèmes de fichiers, tels que ext4
, enregistrent ces informations dans les métadonnées du fichier. Il n'y a pas de moyen standard pour l'obtenir, mais il y a un moyen ( ext
uniquement avec les systèmes de fichiers):
debugfs -R 'stat partition/relative/path/to/file' /dev/sda1
Vous obtiendrez quelque chose comme ça mentionnant crtime
( pas ctime
!) Si vous utilisez 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
Le retour de cette commande peut prendre un certain temps, probablement parce qu'il répertorie également toutes les extensions liées au fichier.
Maintenant, si vous voulez commander des fichiers par date de création, je suppose que cela n’est pas facilement (ni correctement) possible. Comme Gilles le dit, ce serait probablement plus facile si vous utilisiez un système de contrôle de révision. Mais vous pouvez essayer de regarder l' ext4
API ...
J'ai essayé la stat -c '%w' myfile
commande sur un système de ext4
fichiers sur un système Ubuntu (assez récent) sans succès (il ne fait que répondre -
).
f='/path/to/file'; debugfs -R "stat $f" $(df $f|(read a; read a b; echo "$a"))|grep crtime
Voici un script Perl qui utilise la réponse de Totor pour obtenir ce que vous voulez (si votre système de fichiers est ext4).
Fonctionne sur ma machine personnelle (Ubuntu) et mon serveur (CentOS), mais n’a pas été testé au-delà, donc ymmv.
#!/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 };
}
Utilisez cette commande ls -lct
pour trier les fichiers par date de création.
ctime
est changé, et pas créer le temps.