Bir ls nasıl yaparım ve sonuçları oluşturulan tarihe göre nasıl sıralarım?


112

Hangi sırayla tarih sıralanır? Kesinlikle alfanümerik düzen değil.

ls -ltdeğişiklik zamanına göre sıralar. Ama yaratılış zamanına ihtiyacım var.



1
Dosya ext4 dosya sisteminde ise, Linux'ta dosya oluşturma zamanını elde etmenin bir yolu var gibi görünüyor. Bakınız: unix.stackexchange.com/a/131347/182996
kaartic

Yanıtlar:


94

Çoğu sendikada dosya oluşturma zamanı kavramı yoktur. lsBilgi 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 lsbunu gösterme seçeneği yoktur. Yardımcı statprogram 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.


1
In Cygwin öyle ls -c. ve ile birleştirildiğinde ls --helpne -cyaptığını gösterir . -l-lt
Aaron D. Marasco

6
@Aaron Hayır, ctime oluşturma zamanı değil. Tamamen “ctime” ve “yaratma” nın aynı harfle başladığı gerçeğine dayanan ortak bir karışıklıktır, fakat ctime ile yaratma zamanı arasında bir ilişki yoktur. Bu karışıklığı ele almak için cevabımı güncelledim.
Gilles

Lol benim kötü. Cygwin bölümünü sizin için onaylamaya çalışıyordum (IIRC'nin orijinal gönderisinin olası bir emri vardı). Dikkat etseydim özellikle "ctime (dosya durum bilgilerinin son değiştirilme zamanı)" yazıyor.
Aaron D. Marasco

@Gilles cevabına ekleme; Bir NFS 3.x dosya sunucusu kullanıyorum (temel dosya sisteminde emin değil; UFS veya ZFS, ancak UFS'yi tahmin ediyorum). Redhat 6.x altında: -Uoluşturma zamanına göre sıralar. Solaris 10.x altında: oluşturma zamanına göre /usr/bin/lsdesteklemiyor -U, /usr/ucb/lsdesteklemiyor -Uve sıralama yapmıyor. Bu sonuçlar elbette bu bilgiyi ilk etapta depolayan dosya sistemine bağlıdır.
Brian Vandenberg

1
@ghoti Dizinde hiçbir dosya silinmedi (ya da taşındı / yeniden adlandırıldı / hardlinked /…), dizin düzeni bazı dosya sistemlerinde yaratma sırasıdır, ancak hepsi değil. Örneğin ext4'te bu doğru değil. Solaris'in UFS'sinde doğru mu bilmiyorum.
Gilles

16

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, ext4bu bilgileri dosya meta verileri içine kaydeder. Bunu elde etmenin standart bir yolu yok, ancak bir yolu var ( extsadece 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 ext4API’ye bir göz atmayı deneyebilirsiniz ...

stat -c '%w' myfileKomutu ext4(yeterince yeni) bir Ubuntu sistemindeki bir filesytem üzerinde başarılı olmadan denedim (sadece cevaplar -).


Biri bir liner isterse:f='/path/to/file'; debugfs -R "stat $f" $(df $f|(read a; read a b; echo "$a"))|grep crtime
Boop

3

İş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 };
}

Ayrıca bazı dosyaların oluşturma tarihini / saatini kaydeden meta verileri (örneğin exif gibi) olabileceğinden bahsetmek de iyidir. Örneğin, tüm dosyalarınız dijital fotoğrafsa, bu verilere sahip olabilirsiniz. Perl'in Image :: ExifTool kullanarak bir örnek .
Jonathan Cross,

0

ls -lctDosyaları oluşturma tarihine göre sıralamak için bu komutu kullanın .


2
evet, bu "doğru" komut değildir, ancak çoğu durumda aradığınız
şeydir

Alt dizinlerdeki tüm dosyaları bu şekilde yazdırması için "find" ile yapmanın bir yolu var mı?
Colin D

ctimeDeğişim zamanı ve oluşturulma zamanı değil.
Nabi KAZ
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.