すべてのファイルとサブディレクトリを再帰的にリストする


15

パッケージを使用して、すべてのファイル(パスを含む)とサブディレクトリ(または少なくとも空のサブディレクトリ)を再帰的にリストする方法はあります。空でないものへのパスは、そこに含まれるファイル)現在のディレクトリの?

最も近いものprojectile-find-fileprojectileパッケージの機能(またはパッケージのhelm-projectile-find-file機能helm-projectile)ですが、空のフォルダーを一覧表示できないようです。さらに、Gitおよび他のバージョン管理リポジトリでのみ機能するようですが、この制限に対する回避策があるかもしれません。


2
'あなたがやろうとしていることをはっきりとは言えませんが、[このブログ投稿](www.turingmachine.org/bl/2013-05-29-recursively-listing-directories-in-elisp.html)には必要なものが含まれているかもしれませんが、または、[これ](ergoemacs.org/emacs/elisp_traverse_dir.html)をスターターとして試すこともできます。
テルドリア

「リスト」とはどういう意味ですか?パスを含む文字列のリストを返すEmacs Lisp関数が必要ですか?たとえば、行ごとに1つのパスを持つバッファーが必要ですか?すべてのファイルを保存したバッファが必要ですか?(最後の1つは簡単です。diredのlsスイッチに「-R」を追加してください。)
オマー


@Omar:理想的な要件があります:(1)Emacsの一部またはパッケージの一部である、(2)helmまたはのいずれかivyで動作する、つまり結果がhelmor ivyバッファーに表示されること。両方の要件を満たすことが不可能な場合、2番目の要件がより重要です。
エヴァンAad

1
それは本当に2つの異なる質問です。しかし、わかりました、私はそれぞれに答えを提供しました。
ドリュー

回答:


8

使用すると仮定すると、ivyこの関数を使用できます

    (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)))

ありがとう。使用するとどうなりますhelmか?
エヴァンAad

1
申し訳ありませんが、私は知りませんhelmivyかなり軽量です。撃て。
fhdhsni

13

ディレクトリファイルを再帰的に

(これはEmacs 25で追加されたと思います)

ここにマニュアルへのリンクがあります:https : //www.gnu.org/software/emacs/manual/html_node/elisp/Contents-of-Directories.html

名前がregexpに一致するディレクトリの下のすべてのファイルを返します。この関数は、指定されたregexpに一致するベース名(つまり、先頭のディレクトリなし)のファイルを指定されたディレクトリとそのサブディレクトリから再帰的に検索し、一致するファイルの絶対ファイル名のリストを返します(絶対ファイル名を参照) 。ファイル名は深さ優先順で返されます。つまり、サブディレクトリ内のファイルは、その親ディレクトリ内のファイルの前に返されます。さらに、各サブディレクトリにある一致するファイルは、ベース名でアルファベット順にソートされます。デフォルトでは、名前が正規表現に一致するディレクトリはリストから省略されますが、オプションの引数include-directoriesが非nilの場合、それらは含まれます。

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

これは、空のディレクトリが見つかりません
fhdhsni

1
@fhdhsniに設定してみinclude-directoriesましたtか?私はEmacs 24に取り組んでおり、今はこれを試すことができませんが、自宅で数時間でテストできます。
wvxvw

私の悪い。私はそれをしませんでした。回答に含めることをお勧めします。
fhdhsni

4

この回答は、ファイル名とディレクトリ名のリストを取得する代わりに、それらのリストを表示することを前提としています。

使用する標準のEmacsコマンドfind-diredfind-name-diredまたはfind-grep-dired。見つかったファイルとディレクトリ名は、Diredモードバッファに表示されます。(Diredのすべての力を使用して、結果に取り組むことができます。)

ライブラリを使用する場合find-dired+.el、これらの標準のEmacsコマンドの拡張バージョンがfind-time-diredあり、さらに、特定のタイムスタンプより新しいまたは古いファイルを見つけるコマンドがあります。


find-diredまさに私が探しているものですが、名前だけを印刷する方法はありますか?それ以外の場合、ファイルのサイズ、日付、またはアクセス許可は絶対に気にしないので、単一のファイル名は理由なく複数行を取ります。私はの(setcar find-ls-option "-printf '%p\n'")前に実行しようとしましたfind-diredが、何らかの理由でこの方法はアイテム上でEnterを押したときにファイルを開きたくありませんでした。
ハイエンジェル

2
@ Hi-Angel:結果が表示されるバッファーは、Diredモードです。その(ため、ヒットするだけで、ファイル名以外のオン/オフを切り替えることができます。ほとんどの場合はオフのままにし(詳細は表示しません)、詳細を確認する場合は簡単にオンにします。
ドリュー

1

https://github.com/technomancy/find-file-in-projectを参照してください

ファイルを検索するか、ディレクトリを検索するコマンドがあります。しかし、両方ではありません。

1つのバッファーにすべてのサブディレクトリとファイルを再帰的にリストする場合、Emacsには古くから2つのコマンドが組み込まれています。

  1. M-x find-dired。CLIツールに依存していますfind。Windowsでは、CygwinまたはMYSYSをインストールする必要があります。find

  2. M-x find-lisp-find-dired。同じfind-diredですが、Lispで書かれています。したがって、サードパーティの依存関係はありません。また、ロケールをすぐに認識できます。しかし、それはより遅いですfind-dired


私の使用例は、UNIXシェルコマンドls、またはEmacs関数を使用する人と同じfind-fileです。どちらも空のディレクトリを含むファイルとディレクトリの両方をリストします。
エヴァンAad

あるfind-diredfind-lisp-find-dired彼らは現在のディレクトリの内容だけでなく、などそのサブディレクトリ、サブサブディレクトリのそれぞれの内容だけでなく、一覧表示することを再帰的で?
エヴァンAad

はい、再帰的に
チェンビン

1

この答えは、ファイルとディレクトリ名のリストを表示するのではなく、それらのリスト取得したいと仮定しています。

ライブラリDired +を使用する場合は、functionを使用できますdiredp-files-within。(使用するためにDiredバッファにいる必要はありません。)

これはどのEmacsバージョンでも動作し、の一般的なものdirectory-files-recursivelyです。

  • ファイルとディレクトリのリストを渡すことができ、それぞれで再帰的に動作します。

  • または、そのようなリストを返す関数を渡すことができます。

    • 処理されるディレクトリにDiredバッファがある場合、そのバッファで関数が呼び出され、含めるファイルのリストが返されます。

      たとえば、関数がdired-get-marked-files その場合、マークされたファイルとサブディレクトリのみが含まれます。

  • 各ファイルまたはディレクトリが満たす必要がある述語をそれに渡すことができます。正規表現マッチングは、もちろん一種の述語です。

  • シンボリックリンクをたどらないようにすることができます。


0
(defun my-dir-list(ソース)
  ;;
  ;; 現在のバッファ内のリストファイルを印刷する
  ;;
  ;; 未テスト、システムタイプ:gnu
  ;; テスト済み、システムタイプ:windows-nt
  ;;
  (インタラクティブな「sDirectory:」)
  (let((n 0)
    (l-file-dir(および(cd source)(directory-files-and-attributes "./"))))
    (dir-list '())
    (ファイルリスト '())
    )
    (princ(format "%s \ n" default-directory)(current-buffer))
    (一方、l-file-dir
      (if(nth 1(car l-file-dir))
      (setq n(1+ n)
        dir-list(cons((lambda(ソース)
                  (および(not(string-prefix-p "。"(car source)))source))
                (car l-file-dir))dir-list)
        )
    (princ(format "%s \ n"(concat default-directory
                      (および(string-match "\\。[0-9 | Az]"(caar l-file-dir))
                       (caar l-file-dir))))(current-buffer))
    )
      (setq l-file-dir(cdr l-file-dir))
      )
    (while(caar dir-list)
      (setq dir-list(cdr dir-list))
      (cd "..")
      )
    )
  'OK
  )
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.