Menemukan file dengan nama

11

Bagaimana saya bisa membawa semua file dengan nama yang sesuai dengan regex tertentu, secara rekursif dalam pohon direktori, ke buffer dired tunggal?

Jadi saya bisa mengganti nama / menghapus semuanya sekaligus?

iLemming
sumber
2
Sudahkah Anda mempertimbangkan `find-name-dired '? (Menggunakan wildcard, bukan regexps.)
Marco Wahl
2
Anda harus mengirimkannya sebagai jawaban @MarcoWahl. Saya tidak tahu dired bisa melakukan itu!
Tyler
1
Perpustakaan find-dired+.elmemberi Anda versi perintah yang ditingkatkan find-name-dired. Ini menerima argumen opsional yang menentukan (1) min & max kedalaman pencarian dan (2) jalur untuk dikecualikan dari pencarian.
Drew

Jawaban:

11

Wildcard

Menggunakan

M-x find-name-dired

untuk mendapatkan file sesuai dengan wildcard.

Contoh

Temukan semua file dengan akhiran "org" di direktori "~ / org /". Masukkan berikut

M-x find-name-dired
~/org
*org

dan nikmati.

Ekspresi Reguler

Menggunakan

M-x find-dired

dengan argumen yang sesuai untuk mendapatkan file sesuai dengan ekspresi reguler.

Contoh

Temukan semua file dengan akhiran "org" di direktori "~ / org /". Masukkan berikut

M-x find-dired
~/org
-regex ".*org$"

dan nikmati.

Marco Wahl
sumber
Apakah mungkin untuk mengotomatiskan proses ini di mana secara otomatis memeriksa *orgtanpa memasukkannya secara manual
alper
Jika saya mengerti Anda dengan benar ada banyak kemungkinan. Misalnya membuat perintah pencarian khusus dengan (defun my-find-orgfiles () (interaktif) (find-name-dired "~ / myorgs /" "* org")) dan masukkan ke dalam file init Anda. Kemudian gunakan Mx my-find-orgfiles RET. Atau bahkan ikat perintah ke tombol.
Marco Wahl
Bisakah my-find-orgfiles ()diikuti oleh "t" dan "Q" // yang memilih semua dan menerapkan? @Marco Wahl
alper
2

Ekspresi Reguler

Untuk menggunakan regex, Anda mungkin juga mencoba find-lisp-find-dired. Perintah ini milik lib standar. find-lisp , yang seluruhnya ditulis dalam elisp yaitu, Anda tidak perlu menginstal findprogram eksternal .

Sebagai contoh, berikut ini menunjukkan semua file dengan ekstensi '.el' di bawah direktori ~ / lisp:

M-x find-lisp-find-dired RET ~/lisp RET \.el\' RET

(Pertandingan itu menghormati case-fold-search).

Wildcard

Perlu dicatat bahwa sejak rilis Emacs berikutnya (v26.1) Dired mendukung kartu wil di bagian direktori dari argumen nama file. Itu berarti bekerja sebagai berikut:

C-x d ~/soft/*/*.c RET

(Pertandingan ini peka huruf besar-kecil).

Perintah ini menunjukkan dalam buffer Dired semua file dengan ekstensi '.c', 2 level kedalaman di bawah '~ / soft' . Itu berarti, semua file seperti '~ / soft / foo / bar.c' akan terdaftar, tetapi bukan file seperti '~ / soft / qux.c' atau '~ / soft / foo / baz / qux.c' .

Yang sama tetapi tidak peka huruf besar-kecil:

C-x d ~/soft/*/*.[cC] RET

Bonus

Jika Anda menjalankan Dired dengan 'ls' diimplementasikan di elisp, 'ls-lisp' atau 'eshell-ls', maka Anda dapat secara rekursif mendaftarkan semua file yang cocok dengan wildcard dengan sintaksis berikut:

C-x d ~/soft/**/*.c RET

Catat '**'. Dalam hal ini semua file di bawah '~ / soft' yang cocok dengan wildcard ditampilkan, bahkan '~ / soft / qux.c' .

Namun, saat Anda menggunakan insert-directory-program ekspansi wildcard dibuat oleh shell sistem; itu artinya, sintaksis '**' rekursif ini hanya berfungsi jika didukung oleh shell Anda. Misalnya zsh memang mendukungnya, tetapi bash tidak. Dengan shell lain yang zsh, perintah sebelumnya akan melakukan hal yang sama seperti:

C-x d ~/soft/*/*.c RET
Tino
sumber