Tampaknya ls
tidak mengurutkan file dengan benar saat melakukan panggilan rekursif:
ls -altR . | head -n 3
Bagaimana saya dapat menemukan file yang paling baru dimodifikasi dalam direktori (termasuk subdirektori)?
bash
filesystems
find
JMW
sumber
sumber
Jawaban:
Untuk pohon besar, mungkin sulit untuk
sort
menyimpan semuanya dalam ingatan.%T@
memberi Anda waktu modifikasi seperti cap waktu unix,sort -n
mengurutkan secara numerik,tail -1
mengambil baris terakhir (cap waktu tertinggi),cut -f2 -d" "
memotong bidang pertama (timestamp) dari output.Sunting: Sama seperti
-printf
mungkin hanya GNU, penggunaan tambahanstat -c
juga. Meskipun dimungkinkan untuk melakukan hal yang sama pada BSD, opsi untuk memformat berbeda (-f "%m %N"
sepertinya)Dan saya merindukan bagian dari jamak; jika Anda menginginkan lebih dari file terbaru, cukup tambahkan argumen ekor.
sumber
sort -rn | head -3
bukansort -n | tail -3
. Satu versi memberikan file dari yang terlama ke yang terbaru, sementara yang lain beralih dari yang terbaru ke terlama.sort
akan membuat file sementara (dalam/tmp
) sesuai kebutuhan, jadi saya tidak berpikir itu masalah.-printf '%T@ %Tb %Td %TY %p\n'
akan memberi Anda cap tanggal (jika perlu) (mirip denganls
)find . -type f -printf '%TF %TT %p\n' | sort | tail -1
Menindaklanjuti jawaban @ plundra , inilah versi BSD dan OS X:
sumber
find
mendukung+
bukan\;
? Karena itu melakukan hal yang sama (melewati beberapa file sebagai parameter), tanpa-print0 | xargs -0
pipa.head -1
kehead -5
Alih-alih mengurutkan hasil dan hanya menyimpan hasil modifikasi terakhir, Anda dapat menggunakan awk untuk mencetak hanya hasil dengan waktu modifikasi terbesar (dalam waktu unix):
Ini harus menjadi cara yang lebih cepat untuk menyelesaikan masalah Anda jika jumlah file cukup besar.
Saya telah menggunakan karakter NUL (yaitu '\ 0') karena, secara teoritis, nama file dapat berisi karakter apa pun (termasuk spasi dan baris baru) tetapi itu.
Jika Anda tidak memiliki nama pathologis dalam sistem Anda, Anda dapat menggunakan karakter baris baru juga:
Selain itu, ini berfungsi di mawk juga.
sumber
mawk
, alternatif standar Debian.Saya mengalami kesulitan untuk menemukan file yang dimodifikasi terakhir di bawah Solaris 10. Tidak
find
adaprintf
opsi danstat
tidak tersedia. Saya menemukan solusi berikut yang bekerja dengan baik untuk saya:Untuk menampilkan nama file juga gunakan
Penjelasan
find . -type f
menemukan dan mendaftar semua filesed 's/.*/"&"/'
membungkus pathname dalam tanda kutip untuk menangani spasi putihxargs ls -E
mengirimkan jalur yang dikutip kels
,-E
opsi memastikan bahwa stempel waktu penuh (format tahun-bulan-hari-jam-menit-detik-nanoseconds ) dikembalikanawk '{ print $6," ",$7 }'
ekstrak hanya tanggal dan waktuawk '{ print $6," ",$7," ",$9 }'
ekstrak tanggal, waktu, dan nama filesort
mengembalikan file yang diurutkan berdasarkan tanggaltail -1
hanya mengembalikan file yang terakhir dimodifikasisumber
Ini tampaknya berfungsi dengan baik, bahkan dengan subdirektori:
Jika terlalu banyak file, perbaiki temuan.
sumber
-l
pilihan untukls
tampaknya tidak perlu. Hanya-tr
tampaknya cukup.find . -type f -print0 | xargs -0 ls -ltr | tail -n 1
Memperlihatkan file terbaru dengan stempel waktu yang dapat dibaca manusia:
Hasilnya terlihat seperti ini:
Untuk menampilkan lebih banyak file, ganti
-n1
dengan nomor yang lebih tinggisumber
Saya menggunakan sesuatu yang serupa sepanjang waktu, serta daftar top-k dari file yang paling baru dimodifikasi. Untuk pohon direktori besar, bisa jadi lebih cepat untuk menghindari penyortiran . Dalam hal hanya file top-1 yang paling baru dimodifikasi:
Pada direktori yang berisi 1,7 juta file, saya mendapatkan yang terbaru dalam 3.4s, kecepatan 7.5x terhadap solusi 25.5s menggunakan sort.
sumber
lastfile
) dan kemudian Anda dapat melakukan apa pun yang Anda suka dengan hasilnya, sepertils -l $(lastfile .)
, atauopen $(lastfile .)
(pada Mac), dll.Ini memberikan daftar yang diurutkan:
Membalik urutan dengan menempatkan '-r' di perintah sortir. Jika Anda hanya ingin nama file, masukkan "awk '{print $ 11}' |" sebelum '| kepala'
sumber
Di Ubuntu 13, yang berikut melakukannya, mungkin sedikit lebih cepat, karena membalikkan pengurutan dan menggunakan 'head' alih-alih 'tail', mengurangi pekerjaan. Untuk menampilkan 11 file terbaru di pohon:
Temukan . -type f -printf '% T @% p \ n' | sort -n -r | kepala -11 | cut -f2- -d "" | sed -e's, ^. / ,, '| xargs ls -U -l
Ini memberikan daftar lengkap ls tanpa menyortir ulang dan menghilangkan './' yang mengganggu menempatkan 'pada setiap nama file.
Atau, sebagai fungsi bash:
Namun, sebagian besar pekerjaan dilakukan oleh solusi asli Plundra. Terima kasih, plundra.
sumber
Saya menghadapi masalah yang sama. Saya perlu menemukan file terbaru secara rekursif. menemukan butuh sekitar 50 menit untuk menemukan.
Berikut ini sedikit skrip untuk melakukannya lebih cepat:
Ini adalah fungsi rekursif yang mendapatkan item yang dimodifikasi terbaru dari direktori. Jika item ini adalah direktori, fungsinya disebut secara rekursif dan mencari ke direktori ini, dll.
sumber
Saya menemukan yang berikut ini lebih pendek dan dengan output yang lebih dapat diartikan:
Mengingat panjang tetap dari format data ISO standar, pengurutan lexicographical baik-baik saja dan kami tidak membutuhkan
-n
opsi pada pengurutan.Jika Anda ingin menghapus stempel waktu lagi, Anda dapat menggunakan:
sumber
Jika berjalan
stat
pada setiap file satu per satu adalah memperlambat Anda dapat menggunakanxargs
untuk mempercepat beberapa hal:sumber
Ini secara rekursif mengubah waktu modifikasi dari semua direktori di direktori saat ini ke file terbaru di setiap direktori:
sumber
Klien sederhana ini juga akan berfungsi:
Anda dapat mengubah -1 ke jumlah file yang ingin Anda daftarkan
sumber
Saya menemukan perintah di atas berguna, tetapi untuk kasus saya, saya perlu melihat tanggal dan waktu file juga saya punya masalah dengan beberapa file yang memiliki spasi dalam nama-nama. Inilah solusi kerja saya.
sumber
Perintah berikut ini berfungsi pada Solaris:
sumber
Mengabaikan file yang tersembunyi - dengan cap waktu yang bagus & cepat
Hasil
Menangani spasi dalam nama file dengan baik - bukan berarti ini harus digunakan!
Lebih
Lebih
find
berlimpah mengikuti tautan.sumber
Untuk mencari file di / target_directory dan semua sub-direktorinya, yang telah dimodifikasi dalam 60 menit terakhir:
Untuk menemukan file yang paling baru dimodifikasi, diurutkan dalam urutan terbalik dari waktu pembaruan (yaitu, file yang paling baru diperbarui terlebih dahulu):
sumber
Saya lebih suka yang ini, lebih pendek:
sumber
Saya menulis paket pypi / github untuk pertanyaan ini karena saya memerlukan solusi juga.
https://github.com/bucknerns/logtail
Install:
Penggunaan: ekor berganti file
Kegunaan2: Membuka file yang diubah terakhir di editor
sumber