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
$OLDDATA
setelah itu). Oleh karena itu diasumsikan bahwa nama file tidak mengandung karakter khusus (spasi atau karakter wildcard\[*?
). - Beberapa versi
ls
dapat merusak karakter yang tidak dapat dicetak di lokal saat ini. - Jika panjang total nama file terlalu panjang, Anda akan mendapatkan kesalahan. (Perhatikan bahwa
find … -exec
danxargs
tidak dapat membantu di sini, sejakls
harus 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.