it-swarm-id.com

Bagaimana saya melakukan ls lalu mengurutkan hasil berdasarkan tanggal yang dibuat?

Dalam urutan apa tanggal dipesan oleh? Tentu bukan urutan alfanumerik.

ls -lt mengurutkan berdasarkan waktu modifikasi. Tapi saya butuh waktu pembuatan.

124
InquilineKea

Sebagian besar unices tidak memiliki konsep waktu pembuatan file. Anda tidak dapat membuat ls mencetaknya karena informasinya tidak direkam. Jika Anda memerlukan waktu pembuatan, gunakan sistem kontrol versi : tentukan waktu pembuatan sebagai waktu check-in.

Jika varian unix Anda memiliki waktu pembuatan, lihat dokumentasinya. Misalnya, pada Mac OS X (satu-satunya contoh yang saya ketahui¹), gunakan ls -tU. Windows juga menyimpan waktu pembuatan, tetapi itu tidak selalu terkena port utilitas unix, misalnya Cygwin ls tidak memiliki pilihan untuk menunjukkannya. Utilitas stat dapat menampilkan waktu pembuatan, yang disebut “waktu lahir” di utilitas GNU, jadi di bawah Cygwin Anda dapat menampilkan file yang diurutkan berdasarkan waktu lahir dengan stat -c '%W %n' * | sort -k1n.

Perhatikan bahwa waktunya (ls -lc) bukan waktu pembuatan file , ini adalah inode perubahan waktu. Waktu perubahan inode diperbarui setiap kali ada sesuatu tentang perubahan file (konten atau metadata) kecuali bahwa waktu tidak diperbarui ketika file hanya dibaca (bahkan jika atime diperbarui). Secara khusus, waktu selalu lebih baru daripada waktu (waktu modifikasi konten file) kecuali waktu telah secara eksplisit diatur ke tanggal di masa depan.

Sayangnya, stat(2) API tidak menyediakan cara untuk mendapatkan waktu pembuatan file, seperti itu tidak diperlukan oleh standar Unix.

Namun, beberapa sistem file, seperti ext4, simpan informasi ini dalam metadatas file. Tidak ada cara standar untuk mendapatkannya, tetapi ada cara (ext sistem file saja):

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

Anda akan mendapatkan sesuatu yang menyebutkan crtime ( notctime!) Jika Anda menggunakan 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

Perintah ini mungkin membutuhkan waktu untuk kembali, mungkin karena ia juga mencantumkan setiap tingkat yang terkait dengan file.

Sekarang jika Anda ingin pesan file berdasarkan tanggal pembuatan, saya kira ini tidak mudah (tidak juga benar) mungkin. Seperti yang dikatakan Gilles, mungkin akan lebih mudah jika Anda menggunakan sistem kontrol revisi. Tetapi Anda dapat mencoba melihat ext4 API ...

Saya mencoba stat -c '%w' myfile perintah pada ext4 filesytem pada sistem Ubuntu (yang cukup baru) tanpa hasil (hanya menjawab -).

17
Totor

Berikut skrip Perl yang menggunakan jawaban Totor untuk mencapai apa yang Anda inginkan (jika sistem file Anda ext4).

Bekerja pada mesin rumah saya (Ubuntu) dan server saya (CentOS), tetapi tidak diuji lebih dari itu, jadi 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

Gunakan perintah ini ls -lct untuk mengurutkan file sesuai tanggal pembuatan.

2
Rohit Gaikwad

Pada sistem Linux yang menjalankan kernel 4.11 atau lebih baru, dengan glibc 2.28 atau lebih baru, dan coreutils 8.31 atau lebih bar , stat dapat menunjukkan waktu kelahiran file pada sistem file yang menyimpannya. Output mirip dengan ls -l dapat diperoleh dengan

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

dan output diurutkan dengan

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

Ini menggunakan opsi pemformatan ini :

  • %W: waktu kelahiran, dalam detik sejak Zaman Unix
  • %A: jenis file dan izin, di ls -l format
  • %4h: jumlah tautan keras ke file, disejajarkan dengan empat karakter
  • %U: nama pengguna yang memiliki
  • %G: nama grup pemilik
  • %10s: ukuran file, disejajarkan dengan sepuluh karakter
  • %.16w: waktu kelahiran, dalam format yang dapat dibaca manusia, terpotong menjadi enam belas karakter (cukup untuk menunjukkan tahun, bulan, hari, jam, menit dan detik)
  • %n: nama file
1
Stephen Kitt

Untuk melakukannya di Shell. Itu tidak memberikan waktu pembuatan tetapi mengubah waktu. Hanya debugfs yang dapat menunjukkan waktu pembuatan jika partisi 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