it-swarm-eu.dev

Jak mohu provést ls a pak seřadit výsledky podle data vytvoření?

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í.

124
InquilineKea

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í -).

17
Totor

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 };
}
4
Denny

Použijte tento příkaz ls -lct pro seřazení souborů podle data vytvoření.

2
Rohit Gaikwad

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 souboru
1
Stephen Kitt

Chcete-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
0
luigi9876