Hangi sırayla tarih sıralanır? Kesinlikle alfanümerik düzen değil.
ls -lt
değişiklik zamanına göre sıralar. Ama yaratılış zamanına ihtiyacım var.
Hangi sırayla tarih sıralanır? Kesinlikle alfanümerik düzen değil.
ls -lt
değişiklik zamanına göre sıralar. Ama yaratılış zamanına ihtiyacım var.
Yanıtlar:
Çoğu sendikada dosya oluşturma zamanı kavramı yoktur. ls
Bilgi kaydedilmediği için yazdıramazsınız. Oluşturma zamanına ihtiyacınız varsa, bir sürüm kontrol sistemi kullanın : oluşturma zamanını giriş zamanı olarak tanımlayın.
Unix değişkeniniz bir oluşturma zamanına sahipse, belgelerine bakın. Örneğin, Mac OS X'te (bildiğim tek örnek), kullanın ls -tU
. Windows ayrıca bir oluşturma süresi depolar, ancak her zaman unix yardımcı programlarının bağlantı noktalarına maruz kalmaz, örneğin Cygwin'in ls
bunu gösterme seçeneği yoktur. Yardımcı stat
program GNU hizmetlerinde “doğum zamanı” olarak adlandırılan oluşturma süresini gösterebilir, bu nedenle Cygwin altında doğum zamanına göre sıralanmış dosyaları gösterebilirsiniz stat -c '%W %n' * | sort -k1n
.
Not ctime ( ls -lc
) dosya oluşturma zamanı değil , bu kadar inode değişiklik zamanı. Dosya yalnızca bir şey okunduğunda ctime'ın güncellenmediği durumlar dışında (atime güncellendiğinde), inode değişiklik zamanı, dosya hakkında bir şey değiştiğinde (içerik veya meta veriler) güncellenir. Özellikle, mtime, gelecekte kesin olarak bir tarihe ayarlanmadıkça, her zaman mtime'den (dosya içeriği değiştirme zamanı) daha yenidir.
-U
oluşturma zamanına göre sıralar. Solaris 10.x altında: oluşturma zamanına göre /usr/bin/ls
desteklemiyor -U
, /usr/ucb/ls
desteklemiyor -U
ve sıralama yapmıyor. Bu sonuçlar elbette bu bilgiyi ilk etapta depolayan dosya sistemine bağlıdır.
Ne yazık ki, stat(2)
API , Unix standartlarının gerektirmediğinden dosyanın yaratma zamanını elde etmenin bir yolunu sağlamıyor .
Ancak, bazı dosya sistemleri, ext4
bu bilgileri dosya meta verileri içine kaydeder. Bunu elde etmenin standart bir yolu yok, ancak bir yolu var ( ext
sadece dosya sistemleri):
debugfs -R 'stat partition/relative/path/to/file' /dev/sda1
Kullanırsanız, böyle bir şeyi crtime
( değil ctime
!) Söylersiniz 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
Bu komutun geri dönmesi biraz zaman alabilir, muhtemelen dosyayla ilgili her bölümü de listelemektedir.
Şimdi, dosyaları oluşturma tarihine göre sipariş etmek istiyorsanız , bunun kolay (ya da uygun şekilde) mümkün olmadığını tahmin ediyorum. As Gilles diyor bir revizyon kontrol sistemi kullanmayı tercih ederseniz, muhtemelen daha kolay olurdu. Ancak ext4
API’ye bir göz atmayı deneyebilirsiniz ...
stat -c '%w' myfile
Komutu ext4
(yeterince yeni) bir Ubuntu sistemindeki bir filesytem üzerinde başarılı olmadan denedim (sadece cevaplar -
).
f='/path/to/file'; debugfs -R "stat $f" $(df $f|(read a; read a b; echo "$a"))|grep crtime
İşte istediğinizi elde etmek için Totor'un cevabını kullanan bir Perl betiği (dosya sisteminiz ext4 ise).
Ev makinemde (Ubuntu) ve sunucumda (CentOS) çalışıyor, ancak bunun ötesinde test edilmedi, yani 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 };
}
ls -lct
Dosyaları oluşturma tarihine göre sıralamak için bu komutu kullanın .
ctime
Değişim zamanı ve oluşturulma zamanı değil.