16

この関数は、エントリとエントリもdirectory-files返します。関数がすべての既存のエントリを返すのはこの方法だけであることはある意味では真実ですが、これらを含める用途はまだ見ていません。一方、使用するたびに、次のようなものも書きます...directory-files

(unless (string-match-p "^\\.\\.?$" ... 

またはより良い効率のために

(unless (or (string= "." entry)
            (string= ".." entry))
   ..)

特にインタラクティブな使用 ( M-:) では、余分なコードは望ましくありません。

ディレクトリの実際のサブエントリのみを効率的に返す事前定義された関数はありますか?

4

3 に答える 3

9

便利なファイルおよびディレクトリ操作ライブラリであるを使用する場合はf.el、 function のみが必要ですf-entries

ただし、何らかの理由でこのライブラリを使用したくない場合で、移植性のない *nix ソリューションを使用しても問題ない場合は、lscommandを使用できます。

(defun my-directory-files (d)
  (let* ((path (file-name-as-directory (expand-file-name d)))
         (command (concat "ls -A1d " path "*")))
    (split-string (shell-command-to-string command) "\n" t)))

上記のコードで十分ですが、説明についてはさらに読んでください。

ドットを取り除く

によるとman ls

   -A, --almost-all
          do not list implied . and ..

split-string文字列を空白で分割すると、出力を解析できますls

(split-string (shell-command-to-string "ls -A"))

ファイル名のスペース

問題は、一部のファイル名にスペースが含まれている可能性があることです。split-stringデフォルトでは、変数split-string-default-separatorsの正規表現によって分割されます。これは"[ \f\t\n\r\v]+"です。

   -1     list one file per line

-1ファイルを改行で"\n"区切り、唯一のセパレーターとして渡すことができます。これを関数にラップして、任意のディレクトリで使用できます。

(split-string (shell-command-to-string "ls -A1") "\n")

再帰

しかし、再帰的にサブディレクトリに飛び込み、後で使用するためにファイルを返したい場合はどうでしょうか? ディレクトリを変更しlsて . 1 つの解決策は、ls常に絶対パスを返すようにすることです。によるとman ls

   -d, --directory
          list directory entries instead of contents, and do not dereference symbolic links

ワイルドカードとオプションを使用して絶対パスをディレクトリに渡すと、 How can I list files with their absolute path in linux?-dに従って、直接のファイルとサブディレクトリの絶対パスのリストが取得されます。. パス構成の説明については、Elisp で、スラッシュが適切に挿入されたパス文字列を取得する方法を参照してください。.

(let ((path (file-name-as-directory (expand-file-name d))))
  (split-srting (shell-command-to-string (concat "ls -A1d " path "*")) "\n"))

空文字列を省略

Unix コマンドは出力に末尾の空白を追加する必要があるため、プロンプトは新しい行に表示されます。それ以外の場合は、次の代わりに:

user@host$ ls
somefile.txt
user@host$

あるだろう:

user@host$ ls
somefile.txtuser@host$

カスタム セパレータを に渡すsplit-stringと、この改行が単独の行として扱われます。一般に、これにより、空の行が有効なデータである可能性がある CSV ファイルを正しく解析できます。しかし、ヌル文字列になってしまうので、3 番目のパラメーターとして にls渡すことでこれを省略する必要があります。tsplit-string

于 2014-03-13T09:41:21.603 に答える