Dalam urutan apa tanggal dipesan oleh? Tentu bukan urutan alfanumerik.
ls -lt
mengurutkan berdasarkan waktu modifikasi. Tapi saya butuh waktu pembuatan.
Dalam urutan apa tanggal dipesan oleh? Tentu bukan urutan alfanumerik.
ls -lt
mengurutkan berdasarkan waktu modifikasi. Tapi saya butuh waktu pembuatan.
Jawaban:
Sebagian besar unices tidak memiliki konsep waktu pembuatan file. Anda tidak dapat 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 tahu¹), gunakan ls -tU
. Windows juga menyimpan waktu pembuatan, tetapi itu tidak selalu terkena port utilitas unix, misalnya Cygwin ls
tidak memiliki opsi untuk menunjukkannya. The stat
utilitas dapat menunjukkan waktu penciptaan, yang disebut “waktu lahir” di utilitas GNU, jadi di bawah Cygwin Anda dapat menampilkan file diurutkan berdasarkan waktu kelahiran dengan stat -c '%W %n' * | sort -k1n
.
Perhatikan bahwa ctime ( ls -lc
) bukan waktu pembuatan file , ini adalah waktu perubahan inode . 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.
-U
mengurutkan berdasarkan waktu pembuatan. Di bawah Solaris 10.x: /usr/bin/ls
tidak mendukung -U
, /usr/ucb/ls
mendukung , -U
dan mengurutkan berdasarkan waktu pembuatan. Hasil ini jelas tergantung pada sistem file yang menyimpan info itu di tempat pertama.
Sayangnya, stat(2)
API tidak menyediakan cara untuk mendapatkan waktu pembuatan file, karena tidak diperlukan oleh standar Unix.
Namun, beberapa sistem file, seperti ext4
, menyimpan informasi ini dalam metadatas file. Tidak ada cara standar untuk mendapatkannya, tetapi ada cara ( ext
hanya sistem file):
debugfs -R 'stat partition/relative/path/to/file' /dev/sda1
Anda akan mendapatkan sesuatu yang menyebutkan crtime
( tidak ctime
!) Jika Anda gunakan 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 memesan file berdasarkan tanggal pembuatan, saya kira ini tidak mudah (juga tidak benar). 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 (cukup baru) tanpa hasil (hanya menjawab -
).
f='/path/to/file'; debugfs -R "stat $f" $(df $f|(read a; read a b; echo "$a"))|grep crtime
Berikut skrip Perl yang menggunakan jawaban Totor untuk mencapai apa yang Anda inginkan (jika filesystem Anda adalah 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 };
}
Gunakan perintah ini ls -lct
untuk mengurutkan file sesuai tanggal pembuatan.
ctime
adalah perubahan waktu, dan bukan menciptakan waktu.