Jika saya ingin menemukan file terbaru (mtime) dalam direktori (besar) yang berisi subdirektori, bagaimana saya melakukannya?
Banyak posting yang saya temukan menyarankan beberapa variasi ls -lt | head
(mengejutkan, banyak yang menyarankan ls -ltr | tail
yang sama tetapi kurang efisien) yang baik-baik saja kecuali Anda memiliki subdirektori (saya punya).
Kemudian lagi, Anda bisa
find . -type f -exec ls -lt \{\} \+ | head
yang pasti akan melakukan trik untuk file sebanyak yang dapat ditentukan oleh satu perintah, yaitu jika Anda memiliki direktori besar , -exec...\+
akan mengeluarkan perintah terpisah; oleh karena itu masing-masing kelompok akan disortir dengan ls
sendirinya tetapi tidak lebih dari total yang ditetapkan; Oleh karena itu kepala akan mengambil entri terbaru dari batch pertama.
Ada jawaban?
sumber
find: missing argument to '-exec'
+
tidak ada artinyabash
, jadi tidak perlu menghindarinya.Jawaban:
Anda tidak perlu berulang ke perintah eksternal (as
ls
) karenafind
dapat melakukan semua yang Anda butuhkan melalui-printf
tindakan:sumber
find . -type f -exec stat --format=%y \{\} \+ | sort -r | head -n1
tetapi solusi Anda jauh lebih bersih!| cut -d ' ' -f2
untuk mendapatkan nama file sajahead
untuk menyertakan sejumlah baris. Saya hanya perlu baris pertama, jadi saya menggunakanhead -n 1
Saya memiliki masalah yang sama hari ini, tetapi saya menyerang tanpa itu
find
. Saya memerlukan sesuatu yang singkat yang dapat saya jalankanssh
untuk mengembalikan file yang baru diedit di direktori home saya. Inilah kira-kira yang saya pikirkan:The
-p
pilihan untukls
menambahkan slash trailing untuk direktori, yanggrep -v
Menghapus garis berakhir di garis miring (alias, semua direktori), danhead -1
batas-batas output ke file tunggal.Ini jauh lebih tidak jelas daripada menggunakan
find
jika semua yang Anda ingin kembali adalah nama file.sumber
Ini pada sistem saya lebih cepat daripada
printf
, meskipun saya tidak mengerti mengapasumber
... | sort -r | head -n1 | cut -d " " -f 4-
jika Anda ingin mendapatkan nama file saja.sort -r
akan salah jika nama file di beberapa baris ada.EDIT: Saya kira posting ini tidak 'tidak terlalu berguna' seperti yang saya kira. Ini adalah solusi yang sangat cepat yang hanya melacak file yang paling baru dimodifikasi (daripada menyortir seluruh daftar file):
find . -type f -printf '%T@ %p\n' | awk 'BEGIN { mostrecenttime = 0; mostrecentline = "nothing"; } { if ($1 > mostrecenttime) { mostrecenttime = $1; mostrecentline = $0; } } END { print mostrecentline; }' | cut -f2- -d ' '
Sebarkan beberapa baris untuk kejelasan seperti berikut:
Akhir dari EDIT
Bukan pos yang sangat berguna tetapi karena 'mengatur' membahas kecepatan, saya pikir saya akan membagikan ini.
solusi mengatur dan enzotib melibatkan daftar semua file di dalam direktori dengan waktu mereka dan kemudian menyortir. Seperti yang Anda ketahui penyortiran tidak perlu untuk menemukan yang maksimal. Menemukan maksimum dapat dilakukan dalam waktu linier tetapi pengurutan membutuhkan waktu n log (n) [Saya tahu perbedaannya tidak banyak, tetapi tetap;)]. Saya tidak bisa memikirkan cara yang rapi untuk mengimplementasikan ini. [EDIT: A rapi (meskipun terlihat kotor) dan implementasi cepat disediakan di atas.]
Hal terbaik berikutnya - Untuk menemukan file yang paling baru diedit dalam direktori, secara rekursif cari file yang paling baru diedit di setiap subdirektori level 1. Biarkan file ini mewakili subdirektori. Sekarang urutkan file level 1 bersama dengan perwakilan dari subdirektori level 1. Jika jumlah jumlah file level 1 dan sub-dir dari masing-masing direktori hampir konstan, maka proses ini harus skala secara linear dengan jumlah total file.
Inilah yang saya buat untuk mengimplementasikan ini:
Saya menjalankan ini dan mendapat banyak
find: findrecent: No such file or directory
kesalahan. Alasan: -exec dari find running di shell yang berbeda. Saya mencoba mendefinisikan findrecent di .bashrc, .xsessionrc tetapi ini tidak membantu [Saya akan menghargai bantuan di sini]. Pada akhirnya saya memilih untuk meletakkandalam skrip bernama
findrecent
PATH saya dan kemudian jalankan.Saya menjalankan ini, terus menunggu dan menunggu tanpa hasil. Hanya untuk memastikan saya tidak berurusan dengan loop tak terbatas, saya memodifikasi file
dan mencoba lagi. Itu berhasil - tetapi butuh 1 menit 35 detik pada homefolder saya - solusi mengatur dan enzotib mengambil masing-masing 1,69, 1,95 detik!
Begitu banyak keunggulan O (n) dibanding O (n log (n))! Sialan kau fungsi panggilan overhead! [Atau lebih tepatnya panggilan skrip panggilan]
Tapi skrip ini memiliki skala yang lebih baik daripada solusi sebelumnya dan saya yakin itu akan berjalan lebih cepat daripada mereka di bank memori google; D
sumber
Gunakan
perl
dalam conjonctin denganfind
:Anda mendapatkan nama file dengan zaman terbesar == file terakhir yang dimodifikasi.
sumber
Ini hampir tidak modis, tetapi juga mungkin untuk mencapai ini dengan Midnight Commander : cari *, panelisasi hasilnya, urutkan berdasarkan waktu modifikasi dalam urutan terbalik.
Jelas, ini sedikit lebih lambat dari
find
- direktori home saya, yang berisi 922000 file, disortirmc
dalam hampir 14 menit sementarafind
menghabiskan kurang dari 5 - tetapi ada beberapa manfaat:Saya mungkin akan menghabiskan waktu lebih lama daripada perbedaan 9 menit untuk menemukan doa permohonan yang tepat :)
lebih sedikit kemungkinan kesalahan (lupa menentukan -r untuk mengurutkan dll. - mulai lagi)
dimungkinkan untuk bermain dengan hasil yang ditetapkan dengan mengubah urutan urut dll - tanpa meminta kembali file.
mungkin untuk melakukan operasi file hanya pada beberapa file dari set hasil - yaitu mengurutkan berdasarkan ukuran, menghapus beberapa file besar yang tidak diperlukan
sumber