it-swarm.com.de

Wie mache ich ein ls und sortiere dann die Ergebnisse nach dem Erstellungsdatum?

In welcher Reihenfolge werden die Datumsangaben von bestellt? Sicherlich keine alphanumerische Reihenfolge.

ls -lt sortiert nach Änderungszeit. Aber ich brauche Zeit für die Erstellung.

124
InquilineKea

Die meisten Unices haben kein Konzept für die Erstellungszeit von Dateien. Sie können ls nicht zum Drucken bringen, da die Informationen nicht aufgezeichnet werden. Wenn Sie Erstellungszeit benötigen, verwenden Sie ein Versionskontrollsystem : Definieren Sie die Erstellungszeit als Eincheckzeit.

Wenn Ihre Unix-Variante eine Erstellungszeit hat, lesen Sie die Dokumentation. Verwenden Sie beispielsweise unter Mac OS X (das einzige mir bekannte Beispiel¹) ls -tU. Windows speichert auch eine Erstellungszeit, ist jedoch nicht immer Ports von Unix-Dienstprogrammen ausgesetzt, z. B. hat Cygwin ls keine Option, diese anzuzeigen. Das Dienstprogramm stat kann die Erstellungszeit anzeigen, die in GNU-Dienstprogramme als "Geburtszeit" bezeichnet wird). Unter Cygwin können Sie also Dateien nach Geburtszeit sortiert mit stat -c '%W %n' * | sort -k1n Anzeigen. .

Beachten Sie, dass die ctime (ls -lc) nicht die Erstellungszeit der Datei ist , es ist die Inode Änderungszeit. Die Inode-Änderungszeit wird immer dann aktualisiert, wenn sich etwas an der Datei ändert (Inhalt oder Metadaten), außer dass die ctime nicht aktualisiert wird, wenn die Datei lediglich gelesen wird (selbst wenn die Zeit aktualisiert wird). Insbesondere ist die ctime immer aktueller als die mtime (Änderungszeit des Dateiinhalts), es sei denn, die mtime wurde explizit auf ein zukünftiges Datum festgelegt.

Leider bietet die stat(2) API keine Möglichkeit, die Erstellungszeit für Dateien abzurufen, da dies nach den Unix-Standards nicht erforderlich ist.

Einige Dateisysteme, wie ext4, Speichern diese Informationen jedoch in den Dateimetadaten. Es gibt einfach keinen Standardweg, um es zu bekommen, aber es gibt einen Weg (nur ext Dateisysteme):

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

Wenn Sie ext4 Verwenden, erhalten Sie so etwas wie crtime ( nichtctime!).

 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

Die Rückkehr dieses Befehls kann einige Zeit dauern, wahrscheinlich weil er auch alle mit der Datei verbundenen Ausmaße auflistet.

Wenn Sie nun bestellen Dateien nach Erstellungsdatum erstellen möchten, ist dies wahrscheinlich nicht einfach (und auch nicht richtig) möglich. Wie Gilles sagt, wäre es wahrscheinlich einfacher, wenn Sie ein Revisionskontrollsystem verwenden würden. Sie können aber versuchen, einen Blick auf die ext4 - API zu werfen ...

Ich habe den Befehl stat -c '%w' myfile Auf einem ext4 - Dateisystem auf einem (aktuell genug) Ubuntu-System ohne Erfolg ausprobiert (er antwortet nur -).

17
Totor

Hier ist ein Perl-Skript, das die Antwort von Totor verwendet, um das zu erreichen, was Sie wollen (wenn Ihr Dateisystem ext4 ist).

Funktioniert auf meinem Heimcomputer (Ubuntu) und meinem Server (CentOS), wird aber nicht darüber hinaus getestet, also 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

Verwenden Sie diesen Befehl ls -lct, um Dateien nach Erstellungsdatum zu sortieren.

2
Rohit Gaikwad

Auf Linux-Systemen, auf denen Kernel 4.11 oder höher mit glibc 2.28 oder höher und coreutils 8.31 oder höher ausgeführt wird, kann stat die Geburtszeit einer Datei auf Dateisystemen anzeigen, in denen sie gespeichert ist. Ausgabe ähnlich der von ls -l kann mit erhalten werden

stat -c "%A %4h %U %G %10s %.16w %n" *

und sortierte Ausgabe mit

stat -c "%W %A %4h %U %G %10s %.16w %n" * | sort -k1,1n | cut -d\  -f2-

Dies verwendet diese Formatierungsoptionen :

  • %W: die Geburtszeit in Sekunden seit der Unix-Epoche
  • %A: Dateityp und Berechtigungen in ls -l Format
  • %4h: Die Anzahl der festen Links zur Datei, ausgerichtet auf vier Zeichen
  • %U: Name des Besitzers
  • %G: Name der besitzenden Gruppe
  • %10s: Die Dateigröße, ausgerichtet auf zehn Zeichen
  • %.16w: Die Geburtszeit in einem für Menschen lesbaren Format, abgeschnitten auf 16 Zeichen (genug, um Jahr, Monat, Tag, Stunde, Minute und Sekunde anzuzeigen).
  • %n: Der Name der Datei
1
Stephen Kitt

Um es in Shell zu tun. Es wird keine Erstellungszeit angegeben, sondern die Änderungszeit. Nur Debugfs können die Erstellungszeit anzeigen, wenn die Partition ext4 ist

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