GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana mengurutkan hasil dari pernyataan Temukan berdasarkan tanggal?

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 sejak Jan. 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:

  1. 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 \[*? ).
  2. Beberapa versi ls dapat merusak karakter yang tidak dapat dicetak di lokal saat ini.
  3. Jika panjang total nama file terlalu panjang, Anda akan mendapatkan kesalahan. (Perhatikan bahwa find … -exec dan xargs tidak dapat membantu di sini, sejak ls 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 kasus xargs .)

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 penggunaan find .
  • ## 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, seperti ls -t .

Tidak ada cara sederhana untuk melakukan ini dengan kuat menggunakan alat POSIX atau bahkan dengan alat GNU dan ksh.


Linux
  1. Cara Menemukan dan Mengurutkan File Berdasarkan Tanggal dan Waktu Modifikasi di Linux

  2. Bagaimana Mengurutkan Du Output Berdasarkan Ukuran?

  3. Bagaimana Cara Mendapatkan Hanya File yang Dibuat Setelah Berkencan Dengan Ls?

  1. Cara Menemukan file besar linux dengan perintah find dan du

  2. Cara mem-pipe hasil 'find' ke mv di Linux

  3. Bagaimana cara memeriksa zona waktu mana di Linux?

  1. Bagaimana Melakukan A Ls Dan Kemudian Mengurutkan Hasil Berdasarkan Tanggal Dibuat?

  2. Linux – Bagaimana Menemukan Tanggal Pembuatan File?

  3. Bagaimana Tanggal Coreutil Berhasil Mendapatkan Hasil Yang Aneh?