Bagaimana cara saya mengurutkan output grep berdasarkan waktu + tanggal file dibuat?

1

Ketika saya menjalankan perintah ini,

grep _rlnAveragePmax *model*

Saya mendapatkan hasil ini:

run_ct6_it006_model.star:_rlnAveragePmax                             0.153500
run_ct6_it007_model.star:_rlnAveragePmax                             0.096772
run_it000_model.star:_rlnAveragePmax                             0.000000
run_it001_model.star:_rlnAveragePmax                             0.008995
run_it002_model.star:_rlnAveragePmax                         2.517429e-04
run_it003_model.star:_rlnAveragePmax                             0.003727
run_it004_model.star:_rlnAveragePmax                             0.056681
run_it005_model.star:_rlnAveragePmax                             0.109754
run_it006_model.star:_rlnAveragePmax                             0.153500

Tetapi output di atas diurutkan berdasarkan abjad. Jika kami mengurutkannya berdasarkan waktu + tanggal dibuat, hasilnya akan terlihat seperti ini:

run_it000_model.star:_rlnAveragePmax                             0.000000
run_it001_model.star:_rlnAveragePmax                             0.008995
run_it002_model.star:_rlnAveragePmax                         2.517429e-04
run_it003_model.star:_rlnAveragePmax                             0.003727
run_it004_model.star:_rlnAveragePmax                             0.056681
run_it005_model.star:_rlnAveragePmax                             0.109754
run_it006_model.star:_rlnAveragePmax                             0.153500
run_ct6_it006_model.star:_rlnAveragePmax                             0.153500
run_ct6_it007_model.star:_rlnAveragePmax                             0.096772

Apa yang harus saya lakukan untuk perintah grep saya untuk mendapatkan output diurutkan berdasarkan waktu + tanggal dibuat?

pengguna165209
sumber
Ini sangat mudahzsh .
Wildcard

Jawaban:

1

Kecuali Anda menjalankan macOS, tanggal file dibuat tidak disimpan. Konsep itu tidak didefinisikan dengan baik, karena mengedit file sering membuat file baru yang menggantikan versi sebelumnya. Apa yang dicatat adalah tanggal file terakhir diubah (yang mencakup penciptaan awal dan edit berikutnya).

Cara termudah untuk menyortir file berdasarkan waktu modifikasinya adalah dengan menjalankan zsh (berbeda dengan cangkang lain yang kurang kuat seperti bash, ksh atau fish). Di zsh, Anda dapat menggunakan kualifikasi glob seperti Omuntuk mengurutkan file berdasarkan waktu modifikasi (terlama lebih dulu, buat yang Ompaling muda dulu).

grep _rlnAveragePmax *model*(Om)

Itu memberikan hasil yang diinginkan sejak grepmelintasi file dalam urutan yang diberikan pada baris perintah.

Gilles
sumber
0

Pertama, lakukan pengurutan waktu ls, dan kemudian pipa stdout untuk melihat-lihat xargs, menggunakan flag -H untuk memasukkan nama file (karena akan melakukannya hanya untuk satu file, default tidak menyertakan nama file)

Pada grep pertama setelah ls, direktori dikecualikan (anggap ini bukan pencarian rekursif dari contoh yang Anda berikan). Grep kedua setelah ls, memfilter untuk nama file (tanpa xargs)

ls -tpQ --quoting-style=shell | grep -v / | grep model | xargs -i grep -H _rlnAveragePmax {}

Perbarui setelah komentar berharga Wildcard: Untuk memperhitungkan semua kasus di mana nama file mungkin memiliki karakter aneh, nomor inode diekstraksi dari ls, dan disalurkan ke "find" untuk pencocokan nomor inode dan menjalankan perintah grep. xargs diganti dengan "while read line" karena akan ada dua {} yang tidak bisa dibedakan oleh perintah xargs

Symlink diikuti, hanya file yang disertakan, tidak termasuk direktori, dll. Argumen maxdepth berlebihan dalam konteks ini (hanya file yang tersisa) namun saya menyertakannya sehingga pencarian rekursif juga dimungkinkan, dengan mengubah argumen:

ls -ti | cut -d " " -f1 | while read line; do find -L . -maxdepth 1 -type f -inum $line -exec grep -H xxx {} \; ; done
Cevikel Serhat
sumber
@Wildcard Anda benar, terima kasih! Bagaimana dengan itu, termasuk argumen -Q dan --quoting-style. Mencoba sendiri untuk nama file dengan "\ n" dalam namanya, dan ini berhasil?
Serhat Cevikel
Hanya karena itu bekerja pada satu input tertentu tidak berarti itu akan bekerja pada semua input. Saya harus mempelajarinya secara mendalam untuk memastikan. Karena itu mengapa itu adalah ide yang buruk secara umum; itu terlalu rumit. Saya mungkin hanya akan menggunakanzsh untuk use case ini.
Wildcard
Salah satu cara akan mendapatkan hanya nomor inode dari ls dengan -i flag dan piping cut. Tapi saya tidak bisa menemukan cara untuk masuk ke file menggunakan nomor inode saja, masih mencari itu.
Serhat Cevikel
Bagian terakhir dari jawaban ini akan membantu. Lihat juga luncuran ini tentang penggunaanfind .
Wildcard