Bagaimana cara membuat daftar file secara rekursif dan mengurutkannya berdasarkan waktu modifikasi?

13

Bagaimana cara membuat daftar semua file di bawah direktori secara rekursif dan mengurutkan output berdasarkan waktu modifikasi?

Saya biasanya menggunakan ls -lhtctetapi tidak menemukan semua file secara rekursif. Saya menggunakan Linux dan Mac.

ls -l pada Mac OS X bisa memberi

-rw-r--r--    1 fsr  user      1928 Mar  1  2011 foo.c
-rwx------    1 fsr  user      3509 Feb 25 14:34 bar.c

di mana bagian tanggal tidak konsisten atau selaras, jadi solusi harus mempertimbangkan ini.

Solusi sebagian

stat -f "%m%t%Sm %N" ./* | sort -rn | head -3 | cut -f2-

bekerja, tetapi tidak secara rekursif.

qazwsx
sumber
Saya akan menganggap Anda berada di Linux, tetapi Anda harus menentukan OS Anda secara eksplisit baik dalam pertanyaan atau lebih baik sebagai tag.
EBGreen

Jawaban:

2

Berikut ini metode yang statdisarankan @ johnshen64

find . -type f -exec stat -f "%m%t%Sm %N" '{}' \; | sort -rn | head -20 | cut -f2-
Komputis
sumber
find "$PWD" -type f -exec stat -f $'%m\t%N' '{}' \; | sort -rn | cut -f2-akan mencetak hanya jalur absolut dari file pada OS X.
Lri
versi apa statyang Anda gunakan? format Anda di atas tidak berfungsi untuk saya. Aku harus menggunakan berikut: find . -type f -exec stat --printf "%Y\t%y %N\n" '{}' \; | sort -rn | cut -f2-. Ini denganstat (GNU coreutils) 8.23
user84207
12

Gunakan find's -printfdan semacam pada wajar format tanggal:

find -type f -printf '%T+\t%p\n' | sort -n

Ini harus meminimalkan proses garpu dan dengan demikian menjadi yang tercepat.

Contoh jika Anda tidak suka bagian kedua fraksional (yang sering tidak diterapkan dalam sistem file):

find -type f -printf '%T+\t%p\n' | sed 's/\.[[:digit:]]\{10\}//' | sort -n
find -type f -printf '%T+\t%p\n' | cut --complement -c 20-30 | sort -n

EDIT: Standar findpada Mac tidak memiliki -printf. Tetapi tidak sulit untuk menginstal GNU find di Mac (lihat juga tautan itu untuk peringatan lebih lanjut tentang kompatibilitas Mac / Linux dan xargs).

Daniel Andersson
sumber
0

find .harus bisa mendapatkan semua file. Sesuatu seperti ini:

find . -exec ls -dl '{}' \; | sort -k 6,7

Anda perlu menyetelnya untuk kebutuhan Anda.

johnshen64
sumber
saya juga menganggap itu adalah linux, seperti kata EBGreen, ls adalah alias di windows PS jadi Anda perlu menggunakan sort-object dan mendapatkan item anak secara rekursif jika itu yang terjadi tetapi idenya sama.
johnshen64
Apakah ini benar-benar berfungsi dengan benar ketika tanggal terkadang melewatkan bagian tahun, di Mac?
qazwsx
Anda benar, tampilan tanggal untuk file terbaru akan mengacaukan segalanya. Anda perlu menggunakan stat sebagai gantinya untuk mendapatkan tanggal yang diformat persis dalam kasus itu. file-file saya sudah sangat tua sehingga perintahnya berfungsi dengan baik, itu sebabnya saya menambahkan klausa lagu :-)
johnshen64
@ johnshen64: lsdi Linux memiliki --time-formatopsi yang dapat Anda gunakan untuk memastikan bahwa tanggal file terbaru dan yang lebih lama ditampilkan dalam format yang sama.
RedGrittyBrick
ah terima kasih, kamu benar, hanya saja belum menggunakannya. itu jauh lebih sederhana daripada menggunakan stat. itu disebut - waktu-gaya kurasa.
johnshen64
0

Jawaban untuk pertanyaan serupa di situs Unix Stack Exchange membantu saya karena saya menggunakan zsh:

Cara membuat daftar file yang diurutkan berdasarkan tanggal modifikasi secara rekursif (tidak ada perintah stat tersedia!)

Taman Brad
sumber
Ini benar-benar komentar dan bukan jawaban untuk pertanyaan awal. Anda selalu dapat mengomentari posting Anda sendiri, dan setelah Anda memiliki reputasi yang cukup Anda akan dapat mengomentari posting apa pun . Harap baca Mengapa saya perlu 50 reputasi untuk berkomentar? Apa yang bisa saya lakukan?
DavidPostill