Sistem operasi: Linux
Jenis sistem file: ext3
Solusi yang dipilih: bash (script / oneliner), ruby, python
Saya memiliki beberapa direktori dengan beberapa subdirektori dan file di dalamnya. Saya perlu membuat daftar semua direktori yang dibangun sedemikian rupa sehingga setiap direktori tingkat pertama terdaftar di sebelah tanggal dan waktu dari file yang dibuat / dimodifikasi terbaru di dalamnya.
Untuk memperjelas, jika saya menyentuh file atau mengubah isinya beberapa tingkat subdirektori ke bawah, cap waktu itu harus ditampilkan di sebelah nama direktori tingkat pertama. Katakanlah saya memiliki direktori yang disusun seperti ini:
./alfa/beta/gamma/example.txt
dan saya memodifikasi isi file example.txt
, saya perlu waktu itu ditampilkan di sebelah direktori tingkat pertama alfa
dalam bentuk yang dapat dibaca manusia, bukan zaman. Saya sudah mencoba beberapa hal menggunakan find, xargs
, sort
dan sejenisnya tapi aku tidak bisa mendapatkan sekitar masalah bahwa timestamp filesystem dari 'alfa' tidak berubah ketika saya membuat / memodifikasi file beberapa tingkat bawah.
sumber
Jawaban:
Coba yang ini:
Jalankan dengan path ke direktori di mana ia harus mulai memindai secara rekursif (mendukung nama file dengan spasi).
Jika ada banyak file mungkin perlu beberapa saat sebelum mengembalikan apa pun. Kinerja dapat ditingkatkan jika kita menggunakan
xargs
sebagai gantinya:yang sedikit lebih cepat.
sumber
find $1 -type f -print0 | xargs -0 stat --format '%Y :%y %n' | sort -nr | cut -d: -f2- | head
Ini masih bisa cepat untuk saya.brew install coreutils
menggunakan dangstat
bukannyastat
stat
karenafind PATH -type f -printf "%T@ %p\n"| sort -nr
melakukan pekerjaan. Itu juga sedikit lebih cepat seperti itu.find PATH -type f -exec stat -f "%m %N" "{}" \; | sort -nr | head
Untuk menemukan semua file yang status file terakhir diubah N menit yang lalu:
find -cmin -N
sebagai contoh:
find -cmin -5
sumber
sudo find -cmin -1 2>&1 |grep -v /proc/
GNU Find (see
man find
) memiliki-printf
parameter untuk mengirim file, EPOC, mtime dan nama path relatif.sumber
tail
untuk mencegah ribuan baris dari yang dicetak dalam output.awk '{print $2}'
bagian ini tampaknya menyebabkan masalah ketika ada nama file dengan spasi. Berikut ini adalah solusi menggunakansed
sebaliknya, dan juga mencetak waktu di samping jalan:find . -type f -printf '%T@ %Tc %P\n' | sort -n | tail | sed -r 's/^.{22}//'
touch "lala<Enter>b"
untuk membuat file seperti itu. Saya pikir desain utilitas unix memiliki kelemahan besar tentang nama file.Saya mempersingkat jawaban halo yang luar biasa untuk one-liner ini
Diperbarui : Jika ada spasi dalam nama file, Anda dapat menggunakan modifikasi ini
sumber
IFS=$'\n'
tidak aman dalam hal apa pun saat menangani nama file: Newlines adalah karakter yang valid dalam nama file di UNIX. Hanya karakter NUL yang dijamin tidak akan hadir di jalur.Coba ini
Ini digunakan
find
untuk mengumpulkan semua file dari direktori,ls
untuk daftar mereka diurutkan berdasarkan tanggal modifikasi,head
untuk memilih file 1 dan akhirnyastat
menunjukkan waktu dalam format yang bagus.Saat ini tidak aman untuk file dengan spasi putih atau karakter khusus lainnya dalam namanya. Tulis pujian jika belum memenuhi kebutuhan Anda.
sumber
Perintah ini berfungsi di Mac OS X:
find "$1" -type f -print0 | xargs -0 stat --format '%Y :%y %n' | sort -nr | cut -d: -f2- | head
Di Linux, seperti yang diminta poster asli, gunakan
stat
sebagai gantigstat
.Jawaban ini, tentu saja, solusi luar biasa user37078 , dipromosikan dari komentar menjadi jawaban penuh. Saya mencampur wawasan CharlesB untuk digunakan
gstat
pada Mac OS X. Ngomong -ngomong, saya mendapatkan coreutils dari MacPorts daripada homebrew .Dan inilah cara saya mengemas ini menjadi perintah sederhana
~/bin/ls-recent.sh
untuk digunakan kembali:sumber
~/bin/ls-recent.sh
, sudahkah Anda memeriksa skrip untuk perbedaan?find . -exec stat -f '%m%t%Sm %N' {} + | sort -n | cut -f2-
Baik solusi perl dan Python di posting ini membantu saya memecahkan masalah ini di Mac OS X: /unix/9247/how-to-list-files-sorted-by-modification-date-recursively -tidak-stat-perintah-berhasil .
Mengutip dari pos:
Perl:
Python:
sumber
Mengabaikan file tersembunyi - dengan cap waktu yang bagus & cepat
Menangani spasi dalam nama file dengan baik - bukan berarti Anda harus menggunakannya!
Lebih
find
berlimpah dapat ditemukan dengan mengikuti link.sumber
Saya menunjukkan ini untuk waktu akses terbaru, Anda dapat dengan mudah memodifikasi ini untuk melakukan waktu mod terbaru.
Ada dua cara untuk melakukan ini:
1) Jika Anda ingin menghindari penyortiran global yang bisa mahal jika Anda memiliki puluhan juta file, maka Anda dapat melakukannya: (posisikan diri Anda di root direktori tempat Anda ingin memulai pencarian)
Metode di atas mencetak nama file dengan waktu akses yang semakin baru dan file terakhir yang dicetak adalah file dengan waktu akses terbaru. Anda jelas bisa mendapatkan waktu akses terbaru menggunakan "tail -1".
2) Anda dapat menemukan secara rekursif mencetak nama, waktu akses semua file dalam subdirektori Anda dan kemudian mengurutkan berdasarkan waktu akses dan ekor entri terbesar:
Dan begitulah ...
sumber
Saya memiliki alias ini di. Profil yang saya gunakan cukup sering
Jadi ia melakukan apa yang Anda cari (dengan pengecualian itu tidak melintasi perubahan tanggal / waktu beberapa level) - mencari file terbaru (* .log dan * .trc file dalam kasus ini); juga hanya menemukan file yang dimodifikasi pada hari terakhir, lalu urutkan berdasarkan waktu dan mengirimkan output melalui lebih sedikit:
ps. Perhatikan Saya tidak memiliki root pada beberapa server, tetapi selalu memiliki sudo, jadi Anda mungkin tidak perlu bagian itu.
sumber
Anda dapat memberikan perintah printf dari find a try
sumber
Fungsi bash cepat:
Temukan file yang dimodifikasi terbaru dalam direktori:
Anda juga dapat menentukan format tanggal / waktu Anda sendiri sebagai argumen ketiga.
sumber
Berikut ini mengembalikan Anda string cap waktu dan nama file dengan cap waktu terbaru:
Menghasilkan output berupa:
<yy-mm-dd-hh-mm-ss.nanosec> <filename>
sumber
Berikut adalah satu versi yang berfungsi dengan nama file yang mungkin mengandung spasi, baris baru, karakter glob juga:
find ... -printf
mencetak modifikasi file (nilai EPOCH) diikuti oleh spasi dan\0
nama file yang diakhiri.sort -zk1nr
membaca NUL data yang dihentikan dan mengurutkannya secara numerikKarena pertanyaan ditandai dengan Linux, jadi saya mengasumsikan
gnu
utils tersedia.Anda dapat memasang pipa di atas dengan:
untuk mencetak waktu modifikasi dan nama file yang diurutkan berdasarkan waktu modifikasi (paling baru pertama) diakhiri oleh baris baru.
sumber
Inilah yang saya gunakan (sangat efisien):
PROS:
PEMAKAIAN:
dimana:
dir
- direktori yang akan dicari [dir sekarang]number
- jumlah file terbaru untuk ditampilkan [10]Output untuk
find_last /etc 4
terlihat seperti ini:sumber
Untuk
ls
output biasa , gunakan ini. Tidak ada daftar argumen, jadi tidak bisa terlalu lama:Dan dibenarkan dengan
cut
hanya untuk tanggal, waktu, dan nama:EDIT : Hanya perhatikan bahwa jawaban teratas saat ini diurutkan berdasarkan tanggal modifikasi. Itu sama mudahnya dengan contoh kedua di sini, karena tanggal modifikasi adalah yang pertama di setiap baris - tampar yang sejenis di bagian akhir:
sumber
Ini bisa dilakukan dengan fungsi rekursif di bash juga
Biarkan F fungsi yang menampilkan waktu file yang harus diurutkan secara leksikografis yyyy-mm-dd dll., (Tergantung os?)
R fungsi rekursif yang dijalankan melalui direktori
Dan akhirnya
sumber