Cara terbaik untuk membuat daftar 100 file pertama dalam direktori yang diurutkan berdasarkan waktu

12

Apa yang akan menjadi cara terbaik untuk membuat daftar 100 file pertama dalam direktori yang diurutkan berdasarkan cap waktu yang dibuat (terlama dulu). Direktori ini cukup besar (sekitar 100000 file).

Dipipis ke kepala membutuhkan waktu yang lama untuk diselesaikan.

Edit:

  • Filesystem adalah ext3.
  • membatasi jumlah file dalam folder tidak sepadan dengan usaha, karena ini akan menjadi operasi "pembersihan" yang langka dan file dihasilkan oleh perangkat lunak pihak ke-3.
  • Menggunakan waktu yang dimodifikasi file , alih-alih waktu pembuatan menyediakan dan solusi yang dapat diterima.


sumber
1
Jika ini adalah operasi pembersihan, mungkin yang Anda inginkan hanyalah find -mtime +<number of days> -deletemembersihkan semua file yang lebih tua dari usia tertentu. Itu berarti tidak ada jenis yang diperlukan.
Mikel

Jawaban:

14

Anda mengatakan bahwa " ls disalurkan ke kepala memakan waktu yang lama sekali untuk lengkap".

Penyebabnya bukan ls, tetapi jumlah file di direktori Anda. Jika Anda memiliki 100.000 file dalam satu direktori, cara apa pun untuk menyelesaikan masalah ini harus mendapatkan informasi tentang semua 100.000 file sebelum dapat berpikir tentang mengurutkannya atau mencetak output apa pun.

Jika terlalu lama, solusi sebenarnya adalah memecah file menjadi beberapa direktori.

Jika Anda tidak dapat menyebarkan file ke beberapa direktori, apakah ada cara untuk mempersempit jumlah file yang perlu dipertimbangkan ? mis. jika nama file menyertakan tanggal, mungkin Anda bisa memasukkan wildcard sehingga sistem tidak perlu mengurutkan 100.000 file. Atau mungkin mereka diberi nomor urut? (Ini mungkin atau mungkin tidak membantu, tetapi patut dicoba.)

Berapa kali Anda mencoba melakukan ini? Mungkin ada baiknya menyimpan / menyimpan output untuk digunakan kembali .


Sekarang, sebuah pertanyaan.

Apakah Anda yakin maksud Anda "waktu pembuatan" dan bukan "ubah waktu" ? Sebagian besar alat hanya dapat menampilkan "ubah waktu", bukan "waktu pembuatan".

Mendapatkan "waktu pembuatan" adalah hal yang sangat baru, yang membutuhkan sistem file ext4, dan beberapa alat yang tidak mudah dipasang.


Jika Anda ingin mengubah waktu

Ubah waktu (singkatnya waktu) berarti waktu atribut file terakhir berubah.

ls -c macam berdasarkan waktu.

Anda ingin output dalam urutan naik, bukan turun, jadi Anda perlu membalikkan output dengan -ropsi juga.

Jadi Anda bisa melakukannya seperti ini:

ls -cr | head -n 100

Solusi yang lebih lama untuk masalah yang sama menggunakan stat:

find . -mindepth 1 -maxdepth 1 -exec stat -c $'%Z\t%n' '{}' \; |
    sort -k 1n |
    cut -f 2 -d $'\t' |
    head -n 10 |
    sed -e 's/^\.\///'

tapi itu berjalan lebih lambat dari ls -crpada sistem saya.


Jika Anda menginginkan waktu modifikasi

Waktu modifikasi (singkatnya mtime) berarti waktu isi file terakhir diubah.

ls -t mengurutkan berdasarkan mtime.

Ubah ls -crke ls -tr(opsi terbaik) atau ubah stat -c $'%Z\t%n'ke stat -c $'%Y\t%n'.


Jika Anda membutuhkan waktu pembuatan

(singkatnya crtime)

Ini lebih sulit.

Pertama, pastikan direktori berada pada sistem file yang diformat menggunakan ext4. Kamu bisa memakaitune2fs -l <device name> untuk memeriksa ini.

Lalu, ada statformat baru yang disebut %W, yang dapat membantu Anda di sini. Untuk mendapatkannya, Anda harus mengunduh versi GNU Coreutils dirilis pada Oktober 2010 atau setelahnya, ekstrak, kompilasi, dan instal.

Kemudian, tergantung pada kernel Anda, ini mungkin berhasil (belum mencobanya).

find . -mindepth 1 -maxdepth 1 -exec stat -c $'%W\t%n' '{}' \; |
    sort -k 1n |
    cut -f 2 -d $'\t' |
    head -n 10 |
    sed -e 's/^\.\///'

Lihat juga:


Jika Anda mendapatkan kesalahan tentang "'$\t'

The '$\t'notasi membutuhkan bashatau zsh: tidak akan bekerja di dashatau shdi Ubuntu. Jika Anda benar-benar perlu menggunakan cangkang itu, Anda harus mengubah apa pun \tmenjadi Ctrl+ V, Tabdan menghapus yang memimpin $dari sesaat sebelum kutipan pembukaan.

Mikel
sumber
Mungkin saja dia tidak menjalankan ext4. Saya menjalankan Ubuntu 10,04 di semua mesin saya, tetapi menjalankan JFS pada beberapa drive. AFAIK JFS mendukung prangko waktu pembuatan.
jwernerny
Memang. Kami tahu bahwa itu tidak didukung pada ext3 dan didukung pada ext4. Pencarian cepat menunjukkan itu mungkin bekerja dengan zfs, atau ufs FreeBSD, tetapi tidak ada yang umum di Ubuntu! Tidak yakin tentang jfs atau xfs atau apa pun. Akan senang mendengar lebih banyak jika Anda dapat menemukan info / tautan.
Mikel
Terima kasih atas jawaban yang sangat komprehensif dan untuk pengingat halus untuk menulis pertanyaan yang lebih spesifik;) "Cari" ternyata menjadi pemenang berdasarkan kinerja, tipe fs ternyata ext3.
2

Cara lain jika ditemukan melakukan sesuatu hari ini mungkin relevan dengan masalah kinerja Anda:

I=0; ls -cr /dir/ | while read file; do I=`expr $I + 1`; echo "$file"; if [ $I == 100 ]; then break; fi; done

Seharusnya secara teori mulai menghasilkan jauh lebih cepat tapi saya kira itu tergantung dari mana lag berasal. Mungkin hanya butuh lswaktu lama untuk mengurutkan file.

Oli
sumber
Aku meragukan itu. headsebenarnya keluar segera setelah input cukup dibaca. Coba jalankan keduanya dengan timedi depan. The headVersi jauh lebih cepat pada sistem saya pula.
Mikel