Sortir file berdasarkan waktu modifikasi

8

Saya telah melihat banyak pertanyaan dan jawaban di sini menggunakan konstruksi di sepanjang baris

list_dir=`ls -t /path/to/dir/`
for i in $list_dir; do

atau

ls -t | while read i; do

Sekarang, saya tahu bahwa Anda tidak boleh menggunakan ls dalam skrip karena mudah rusak; tetapi saya tidak dapat menemukan cara yang lebih baik untuk beroperasi pada file dalam urutan dari yang terakhir diubah ke yang paling baru-baru ini dimodifikasi (atau sebaliknya).

Saya dapat menggunakan sesuatu seperti:

find . -type f -printf '%T@ %p\n' | sort -n | cut -d ' ' -f 2- | while read i; do...

... tetapi ini masih akan terputus dengan file apa pun yang memiliki baris baru dalam namanya, dan jauh lebih jelek untuk di-boot. Apakah ada cara yang lebih baik?

Evilsoup
sumber

Jawaban:

8

"Jangan gunakan ls di skrip" adalah masalah dengan POSIX ls "hanya"; untuk GNU lihat --quoting-style=.

GNU sort memecahkan masalah dengan --zero-terminated.

Jika itu harus kompatibel maka Anda dapat menggunakan find ... -execuntuk meneruskan satu nama file pada suatu waktu ke skrip yang melakukan pelarian. Jika setidaknya bash tersedia:

start cmd:> testfunc () { echo "${1//$'\n'/\n}"; }
start cmd:> testfunc a$'\n'b
a\nb
Hauke ​​Laging
sumber
Ahh, --zero-terminated- terima kasih untuk itu, saya berharap saya bisa memberi Anda lebih banyak poin!
evilsoup
... OK, saya sedikit bingung dengan info ls: jika saya ingin skrip antipeluru dengan ls, yang --quoting-styleharus saya gunakan?
evilsoup
@ evilsoup Saya pikir --quoting-style=escapeadalah cara untuk memilih.
Hauke ​​Laging
Sekarang, untuk membuat beberapa file dengan baris baru dalam nama mereka untuk mengujinya: P
evilsoup
1
Juga: Saya menemukan kasus ekstrim di mana GNU pernah ls --quoting-stylegagal (untuk parsing purposea) karena hanya mengutip nama file: ketika Anda memiliki ruang dalam nama grup. Ok, ini kasus yang sangat strage, tetapi itu muncul di cygwin bash shell, di sini Anda memiliki nama grup seperti Domain Users.
DavAlPi
4

Cara termudah sejauh ini adalah menggunakan zsh. Jenis kualifikasi glob om cocok dalam urutan kronologis terbalik; gunakan Omuntuk urutan kronologis.

for x in /path/to/dir/*(Nom); do …

The Nkualifikasi glob menyebabkan pola untuk memperluas ke daftar kosong jika direktori kosong. Buat ini *(DNom)agar sesuai dengan file dot.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
1
Dang, ini pertama kalinya aku tergoda untuk repot-repot melihat kerang lain - itu sangat bagus.
evilsoup