26.10 目录内容

目录是一种特殊文件,其中包含以不同名称登记的其他文件。目录是文件系统的一项功能。

Emacs 可以将目录中的文件名以 Lisp 列表形式返回,也可以使用 Shell 命令 ls 在缓冲区中显示这些名称。在后一种情况下,可以根据传给 ls 的选项可选地显示每个文件的相关信息。

Function: directory-files directory &optional full-name match-regexp nosort count

该函数返回目录 directory 中的文件名列表。默认按字母顺序排序。

如果 full-namenil,函数返回文件的绝对文件名;否则返回相对于指定目录的文件名。

如果 match-regexpnil,函数只返回非目录部分匹配该正则表达式的文件名,其他文件名将被排除。在大小写不敏感的文件系统上,正则匹配也不区分大小写。

如果 nosortnildirectory-files 不会对列表排序,返回的文件名顺序随机。如果你追求极致速度且不关心处理顺序,可使用此选项。如果处理顺序对用户可见,排序通常会带来更好体验。

如果 countnil,函数只返回前 count 个文件名,或全部文件(取较少者)。count 必须是大于 0 的整数。

(directory-files "~lewis")
     ⇒ ("#foo#" "#foo.el#" "." ".."
         "dired-mods.el" "files.texi"
         "files.texi.~1~")

如果 directory 不是可读取的目录名,会抛出错误。

Function: directory-empty-p directory

该工具函数在 directory 是可访问目录且不包含任何文件(即为空目录)时返回 t。在会返回 ‘.’ 和 ‘..’ 的系统上,会忽略这两项。

指向目录的符号链接视为目录。可使用 file-symlink-p 区分符号链接。

Function: directory-files-recursively directory regexp &optional include-directories predicate follow-symlinks

返回 directory 下所有名称匹配 regexp 的文件。该函数递归搜索指定目录及其子目录,查找 basename(不含前置目录)匹配正则表达式 regexp 的文件,并返回匹配文件的绝对文件名列表(see absolute file names)。文件名按深度优先顺序返回,即子目录中的文件排在其父目录文件之前。此外,每个子目录中的匹配文件按 basename 字母序排序。默认情况下,名称匹配 regexp 的目录不会出现在列表中;如果可选参数 include-directoriesnil,则会包含这些目录。

默认会进入所有子目录。如果 predicatet,则忽略进入子目录时发生的错误(例如无权限读取)。如果它既非 nil 也非 t,则应为一个单参数函数(参数为子目录名),返回非 nil 时才进入该目录。

默认不跟随指向子目录的符号链接;如果 follow-symlinksnil,则会跟随。

Function: locate-dominating-file file name

file 开始,向上遍历目录树,查找第一个存在名称为 name(字符串)的目录,并返回该目录。如果 file 是普通文件,则从其所在目录开始搜索;否则 file 应为搜索起始目录。函数依次在起始目录、父目录、祖父目录……中查找,直到找到包含 name 的目录,或到达文件系统根目录仍未找到——后一种情况返回 nil

参数 name 也可以是一个谓词函数。该函数会对从 file 开始遍历的每个目录调用谓词(即使 file 不是目录),传入一个参数(文件或目录名),返回非 nil 时表示找到目标目录。

Function: file-in-directory-p file dir

如果 file 位于目录 dir 或其子目录中,该函数返回 t。如果 filedir 是同一个目录,也返回 t。函数会比较两者的真实路径。如果 dir 不是已存在目录,则返回 nil

Function: directory-files-and-attributes directory &optional full-name match-regexp nosort id-format count

该函数在筛选文件和处理文件名方式上与 directory-files 类似。但它不返回文件名列表,而是为每个文件返回一个列表 (filename . attributes),其中 attributesfile-attributes 对该文件返回的属性结构。可选参数 id-format 的含义与 file-attributes 的对应参数一致(see Definition of file-attributes)。

Constant: directory-files-no-dot-files-regexp

该正则表达式匹配除 ‘.’ 和 ‘..’ 之外的任何文件名。更精确地说,它匹配任意非空字符串中除这两个名称之外的部分。适合作为 directory-filesdirectory-files-and-attributesmatch-regexp 参数:

(directory-files "/foo" nil directory-files-no-dot-files-regexp)

如果目录 ‘/foo’ 为空,则返回 nil

Function: file-expand-wildcards pattern &optional full regexp

该函数展开通配符模式 pattern,返回匹配的文件名列表。

pattern 默认为 glob / 通配符字符串,例如 ‘"/tmp/*.png"’ 或 ‘"/*/*/foo.png"’;如果可选参数 regexpnil,则 pattern 可作为正则表达式使用。无论哪种方式,匹配都按子目录分别进行,不能跨父子目录匹配。

如果 pattern 是绝对文件名,返回值也为绝对路径。

如果 pattern 是相对文件名,则按当前默认目录解析。返回的文件名通常也相对当前默认目录;但如果 fullnil,则返回绝对路径。

Function: insert-directory file switches &optional wildcard full-directory-p

该函数在当前缓冲区中插入目录 file 的列表,格式由 ls 根据 switches 控制。执行后光标位于插入文本之后。switches 可以是选项字符串,也可以是表示单个选项的字符串列表。

参数 file 可以是目录或包含通配符的文件说明。如果 wildcardnil,表示将 file 视为带通配符的文件说明。

如果 full-directory-pnil,表示目录列表应显示目录的完整内容。当 file 是目录且选项中不含 ‘-d’ 时应指定为 t。(ls 的 ‘-d’ 选项表示将目录本身作为文件描述,而非显示其内容。)

在大多数系统上,该函数通过运行变量 insert-directory-program 中的程序生成目录列表。如果 wildcardnil,还会运行 shell-file-name 指定的 Shell 以展开通配符。

MS-DOS 和 MS-Windows 通常缺少标准 Unix 程序 ls,因此该函数用 Lisp 代码模拟其行为。

技术细节:当 switches 包含长选项 ‘--dired’ 时,insert-directory 会为 dired 做特殊处理。但通常等价的短选项 ‘-D’ 会像其他普通选项一样直接传给 insert-directory-program

User Option: insert-directory-program

该用户选项指定为 insert-directory 生成目录列表所运行的程序。在使用 Lisp 代码生成列表的系统上忽略此选项。


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike