Tüm dosyaları ve alt dizinleri özyinelemeli olarak listeleme


15

Tüm dosyaları (yollarla) ve alt dizinleri (veya en azından boş alt dizinleri) yinelemeli olarak listelemenin bir yolu var mı , çünkü boş olmayanlara giden yollar, içinde bulunan dosyalar mevcut dizinin)?

Bulabildiğim en yakın paketin projectile-find-fileişlevi projectile(alternatif olarak paketin helm-projectile-find-fileişlevi helm-projectile), ancak boş klasörleri listeleyemiyor gibi görünüyor. Ayrıca, yalnızca Git ve diğer sürüm denetimi depolarıyla çalışıyor gibi görünüyor, ancak bu sınırlama için bir geçici çözüm olabilir.


2
ne yapmaya çalıştığınızdan pek emin değilim, ancak [bu blog yazısı] (www.turingmachine.org/bl/2013-05-29- recursively-listing-directories-in-elisp.html) ihtiyacınız olanı içerebilir, ya da [this one] 'ı (ergoemacs.org/emacs/elisp_traverse_dir.html) başlangıç ​​olarak deneyebilirsiniz.
theldoria

"Liste" ile ne demek istiyorsun? Yolları olan dizelerin listesini döndüren bir Emacs Lisp işlevi ister misiniz? İçinde yolları olan bir arabellek ister misiniz, mesela her satıra bir tane? Tüm dosyaları içeren dired bir arabellek ister misiniz? (Bu sonuncusu kolaydır, ls anahtarları dired "-R" ekleyin.)
Omar


@Omar: İdeal şartlara ihtiyacım var: (1) Emacs'ın bir parçası veya bir paketin parçası olması, (2) ya birlikte çalışacağı ya helmda ivysonuçların bir helmya da ivytamponda görüntüleneceği. Her iki şartı da yerine getirmek imkansızsa, ikincisi benim için daha önemlidir.
Evan Aad

1
Bu gerçekten iki farklı soru. Ama tamam, her birine bir cevap verdim.
Drew

Yanıtlar:


8

Kullandığınızı varsayarak ivybu işlevi kullanabilirsiniz

    (defun fhd/counsel-everything ()
      "list everything recursively"
      (interactive)
      (let* ((cands (split-string
                     (shell-command-to-string "find .") "\n" t)))
        (ivy-read "File: " cands
                  :action #'find-file
                  :caller 'fhd/counsel-everything)))

Teşekkürler. Ya kullanırsam helm?
Evan Aad

1
Üzgünüm, bilmiyorum helm. ivyoldukça hafif. Vurun.
fhdhsni

13

Dizin-files-yinelemeli

(Sanırım bu Emacs 25'e eklendi)

kılavuzun bağlantısı: https://www.gnu.org/software/emacs/manual/html_node/elisp/Contents-of-Directories.html

Dizinin altındaki adları normal ifadeyle eşleşen tüm dosyaları döndür. Bu işlev, belirtilen dizinde ve alt dizinlerinde, yinelenen olarak, taban adları (örneğin, önde gelen dizinler olmadan) belirtilen normal ifadeyle eşleşen dosyaları arar ve eşleşen dosyaların mutlak dosya adlarının bir listesini döndürür (mutlak dosya adlarına bakın) . Dosya adları önce derinlik sırasına göre döndürülür, yani bazı alt dizindeki dosyalar üst dizinindeki dosyalardan önce döndürülür. Ayrıca, her alt dizinde bulunan eşleşen dosyalar temel adlarına göre alfabetik olarak sıralanır. Varsayılan olarak, adları regexp ile eşleşen dizinler listeden çıkarılır, ancak isteğe bağlı include-dizinleri nil değilse, dahil edilirler.

Misal

(directory-files-recursively default-directory "")

Boş dizinler bulamıyor
fhdhsni

1
@fhdhsni ayarını denedin mi include-directorieshiç t? Emacs 24 üzerinde çalışıyorum ve şu anda deneyemiyorum, ancak bunu birkaç saat içinde evde test edebilirim.
wvxvw

Benim hatam. Bunu ben yapmadım. Cevabınıza eklemek isteyebilirsiniz.
fhdhsni

4

Bu yanıt , Lisp listesini almak yerine dosya ve dizin adlarının bir listesini görüntülemek istediğinizi varsayar .

Kullanım standart Emacs komutları find-dired, find-name-diredveya find-grep-dired. Bulunan dosya ve dizin adları Dired-mode buffer'da görüntülenir. (Dired'ın tüm gücünü sonuçlar üzerinde çalıştırabilirsiniz.)

Kitaplık kullanıyorsanız find-dired+.el, bu standart Emacs komutlarının gelişmiş sürümlerine sahipsiniz find-time-dired, ayrıca belirli bir zaman damgasından daha yeni veya daha eski dosyaları bulan bir komutunuz var .


find-diredtam olarak aradığım şey, ama sadece isimleri yazdırmanın bir yolu var mı? Aksi takdirde tek bir dosya adı, dosya boyutunu, tarihini veya izinlerini kesinlikle umursamadığım için sebepsiz birden çok satır alır. Koşuyorum denedim (setcar find-ls-option "-printf '%p\n'")önce find-dired, ama nedense bu şekilde basılması üzerine bir dosyayı açmak istemiyorum dired girin bir öğe üzerinde.
Hi-Angel

2
@ Hi-Angel: Sonuçların görüntülendiği arabellek Dired modunda. Böylece (, dosya adlarından daha fazlasını gösterme / kapatma için geçiş yapmanız yeterlidir. Çoğu zaman kapalı bırakıyorum (ayrıntı gösterilmiyor) ve bazı ayrıntıları kontrol etmek istediğimde kısaca açıyorum.
Drew

1

Bkz. Https://github.com/technomancy/find-file-in-project

Dosya bulma veya dizinleri bulma komutları vardır. Ama ikiside değil.

Tüm alt dizinleri ve dosyaları tek bir arabellekte yinelemeli olarak listelemek istiyorsanız, Emacs'ta asırlar için yerleşik iki komut vardır:

  1. M-x find-dired. CLI aracına bağlıdır find. Windows'ta Cygwin veya MYSYS'yi yüklemeniz gerekir.find

  2. M-x find-lisp-find-dired. find-diredLisp ile aynı fakat yazılmıştır. Yani üçüncü bir bağımlılık yok. Ayrıca, yerel ayarları kutunun dışında tanıyabilir. Ama daha yavaşfind-dired


Kullanım durumum UNIX kabuk komutunu lsveya Emacs işlevini kullanan ve find-fileher ikisi de boş dizinler de dahil olmak üzere hem dosyaları hem de dizinleri listeleyen herkesle aynı olurdu .
Evan Aad

Are find-diredve find-lisp-find-diredonlar geçerli dizinin sadece içeriğini listelemek ki özyinelemeli ancak vb alt dizinleri, alt alt dizinleri, her birinin de içeriği?
Evan Aad

Evet, özyinelemeli
chen bin

1

Bu yanıt , bir liste görüntülemek yerine dosya ve dizin adlarının Lisp listesini almak istediğinizi varsayar .

Dired + kitaplığını kullanıyorsanız işlevi kullanabilirsiniz diredp-files-within. (Kullanmak için bir Dired buffer'da olmanız gerekmez.)

Bu herhangi bir Emacs sürümü ile çalışır ve daha geneldir directory-files-recursively.

  • Dosya ve dizinlerin bir listesini aktarabilirsiniz ve her birinde yinelemeli olarak hareket eder.

  • Ya da böyle bir liste döndüren bir işlevi iletebilirsiniz .

    • İşlenecek bir dizin için bir Dired buffer varsa, işlev dahil edilecek dosyaların listesini döndürmek için bu arabellekte çağrılır.

      Örneğin, işlev dired-get-marked-files yalnızca işaretli dosyalar ve alt dizinler içeriyorsa.

  • Her dosya veya dizinin yerine getirmesi gereken bir öngörü iletebilirsiniz . Normal ifade eşleşmesi elbette bir tür yüklemdir.

  • Sembolik bağlantıları takip etmemesini söyleyebilirsiniz.


0
(defun direktif listem (kaynak)
  ;;
  ;; Liste dosyalarını geçerli arabellekte yazdır
  ;;
  ;; Test edilmedi, sistem tipi: gnu
  ;; Test edildi, sistem tipi: windows-nt
  ;;
  (etkileşimli "sDirectory:")
  (hadi ((n 0)
    (l-file-dir (ve (cd kaynağı) (dizin dosyaları ve öznitelikleri "./"))))
    (dir-list '())
    (dosya listesi '())
    )
    (princ ("% s \ n" varsayılan dizini biçimlendir) (current-buffer))
    (l-file-dir ise
      (eğer (n. 1 (araba l-dosya-dizini))
      (setq n (1+ n)
        dir-list (eksileri ((lambda (kaynak))
                  (ve (not (string-prefix-p "." (araba kaynağı))) kaynağı))
                (araba l-dosya-dizini)) dizin listesi)
        )
    (princ ("% s \ n" biçimini) (concat default-directory
                      (ve (dize eşleşmesi "\\. [0-9 | Az]" (caar l-file-dir))
                       (caar l-file-dir)))) (geçerli tampon))
    )
      (setq l-dosya-dizini (cdr l-dosya-dizini))
      )
    (while (caar dizin listesi)
      (setq dizin listesi (cdr dizin listesi))
      (cd "..")
      )
    )
  'tamam
  )
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.