V jakém pořadí jsou data řazena? Rozhodně ne alfanumerický řád.
ls -lt
seřadí podle času modifikace. Ale potřebuji čas na vytvoření.
Většina odvětví nemá představu o čase vytvoření souboru. Nemůžete si nechat vytisknout ls
, protože informace nejsou zaznamenány. Pokud potřebujete čas vytvoření, použijte systém řízení verzí : definujte čas vytvoření jako čas přihlášení.
Pokud má vaše unixová varianta čas vytvoření, podívejte se na její dokumentaci. Například na Mac OS X (jediný příklad, který znám ¹), použijte ls -tU
. Windows také ukládá čas vytvoření, ale není vždy vystaven portům unixových utilit, například Cygwin ls
nemá možnost jej zobrazit. Obslužný program stat
může zobrazit čas vytvoření nazývaný „čas narození“ v GNU utilities), takže pod Cygwin můžete zobrazit soubory seřazené podle doby narození pomocí stat -c '%W %n' * | sort -k1n
.
Všimněte si, že ctime (ls -lc
) není čas vytvoření souboru , je to čas inode čas změny. Čas změny inodu se aktualizuje vždy, když se něco o souboru změní (obsah nebo metadata), kromě toho, že ctime se neaktualizuje, když se soubor pouze přečte (i když je atime aktualizován). Zejména je ctime vždy novější než mtime (čas úpravy obsahu souboru), pokud nebyl mtime v budoucnu explicitně nastaven na datum.
Bohužel API stat(2)
neposkytuje způsob, jak získat čas vytvoření souboru, protože je to standardy Unix není vyžadováno .
Některé souborové systémy, například ext4
, Však tyto informace ukládají do metadat souboru. Neexistuje pouze standardní způsob, jak to získat, ale existuje způsob (pouze [souborové systémy ext
):
debugfs -R 'stat partition/relative/path/to/file' /dev/sda1
Pokud byste použili ext4
, Dostali byste něco podobného s uvedením crtime
( ne ctime
!).
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
Vrácení tohoto příkazu může nějakou dobu trvat, pravděpodobně proto, že také uvádí všechny rozsahy související se souborem.
Nyní, pokud chcete uspořádat soubory podle data vytvoření, myslím, že to není snadné (ani správně) možné. Jak říká Gilles , pravděpodobně by bylo jednodušší, kdybyste použili kontrolní systém revizí. Ale zkuste se podívat na API ext4
...
Vyzkoušel jsem příkaz stat -c '%w' myfile
Na souborovém souboru ext4
V (dostatečně nedávném) systému Ubuntu bez úspěchu (pouze odpoví -
).
Zde je skript v jazyce Perl, který používá odpověď Totora k dosažení toho, co chcete (pokud je váš souborový systém ext4).
Funguje na mém domácím počítači (Ubuntu) a na mém serveru (CentOS), ale mimo to se netestuje, takže 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 };
}
Použijte tento příkaz ls -lct
pro seřazení souborů podle data vytvoření.
V systémech Linux, které používají jádro 4.11 nebo novější, s glibc 2.28 nebo novějšími a coreutils 8.31 nebo novější , může stat
zobrazit čas narození souboru v souborových systémech, které jej ukládají. Výstup podobný výstupu ls -l
lze získat pomocí
stat -c "%A %4h %U %G %10s %.16w %n" *
a tříděný výstup pomocí
stat -c "%W %A %4h %U %G %10s %.16w %n" * | sort -k1,1n | cut -d\ -f2-
To používá tyto možnosti formátování :
%W
: čas narození, v sekundách od Unixové epochy%A
: typ souboru a oprávnění, v ls -l
formát%4h
: počet pevných odkazů na soubor, zarovnaných na čtyři znaky%U
: jméno vlastníka uživatele%G
: název vlastnící skupiny%10s
: velikost souboru zarovnána na deset znaků%.16w
: čas narození, ve formátu čitelném člověkem, zkrácený na šestnáct znaků (dost na zobrazení roku, měsíce, dne, hodiny, minuty a sekundy)%n
: název souboruChcete-li to v Shell. Neposkytují čas vytvoření, ale mění čas. Pouze debugfs mohou zobrazovat čas vytvoření, pokud je oddíl ext4
disk=$(df -Th . | grep ext4 |awk '{print $1}')
for file in "."/*
do
inode=$(ls -i $file | awk '{print $1}')
crtime=$(debugfs -R "stat <$inode>" $disk 2>/dev/null | grep crtime | awk -F'-- ' '{print $2}' | awk '{print $2,$3,$5,$4}')
printf "$crtime\t$file\n"
done | sort -k4 | sort -n -k 3 -k 1M -k2 -k4