dapatkan nama file saja ... diurutkan berdasarkan hari modifikasi
find + sort + cut pendekatan:
find . -regex ".*/[0-9.]+" -printf "%[email protected] %f\n" | sort | cut -d' ' -f2
-
%[email protected]- Waktu modifikasi file terakhir, dimana@adalah detik sejakJan. 1, 1970, 00:00 GMT,dengan bagian pecahan -
%f- Nama file dengan direktori terkemuka dihapus (hanya elemen terakhir)
Untuk mengurutkan dalam urutan menurun:
find . -regex ".*/[0-9.]+" -printf "%[email protected] %f\n" | sort -k1,1r | cut -d' ' -f2
Metode Anda dapat diadaptasi untuk bekerja dalam kasus sederhana. Masalah utama yang Anda hadapi adalah Anda memberikan input ke ls , tetapi ls tidak mengambil masukan apapun. ls mengambil argumen baris perintah. Jadi, Anda harus meneruskan keluaran find sebagai argumen ke ls , dengan substitusi perintah. Juga, jika direktori cocok, berikan -d ke ls untuk mencantumkan direktori itu sendiri dan bukan isinya.
OLDDATA=$(ls -td $(find . -regex ".*/[0-9.]+"))
Hanya dalam kasus sederhana, karena ada dua batasan:
- Ini bergantung pada substitusi perintah yang tidak dikutip (dan begitu juga dengan penggunaan
$OLDDATAsetelah itu). Oleh karena itu diasumsikan bahwa nama file tidak mengandung karakter khusus (spasi atau karakter wildcard\[*?). - Beberapa versi
lsdapat merusak karakter yang tidak dapat dicetak di lokal saat ini. - Jika panjang total nama file terlalu panjang, Anda akan mendapatkan kesalahan. (Perhatikan bahwa
find … -execdanxargstidak dapat membantu di sini, sejaklsharus dijalankan sekali untuk mendapatkan urutan nama file yang benar. Yang bisa mereka lakukan hanyalah menyembunyikan kesalahan dan menghasilkan keluaran yang tidak diurutkan dengan benar — dan mengotak-atik beberapa karakter lagi, dalam kasusxargs.)
Cara kuat dan sederhana untuk melakukan ini adalah dengan menggunakan zsh. Ini memiliki kemampuan untuk mengurutkan kecocokan karakter pengganti, berkat kualifikasi glob.
setopt extended_glob
OLDDATA=(**/[0-9.]##(om))
- Karena ini tidak memanggil program lain, tidak ada batasan panjang selain memori yang tersedia, dan tidak ada risiko nama file terkoyak kapan saja.
- Hasilnya adalah daftar string (setiap string menjadi nama file), bukan string, sehingga masuk ke dalam variabel array.
**/melintasi subdirektori secara rekursif, menghindari penggunaanfind.##berarti “satu atau lebih dari yang sebelumnya” dalam zsh extended glob syntax, analog dengan+dalam sintaks regex (diperpanjang).(om)adalah kualifikasi glob untuk mengurutkan file berdasarkan waktu modifikasi, sepertils -t.
Tidak ada cara sederhana untuk melakukan ini dengan kuat menggunakan alat POSIX atau bahkan dengan alat GNU dan ksh.