目录是一种特殊文件,其中包含以不同名称登记的其他文件。目录是文件系统的一项功能。
Emacs 可以将目录中的文件名以 Lisp 列表形式返回,也可以使用 Shell 命令 ls 在缓冲区中显示这些名称。在后一种情况下,可以根据传给 ls 的选项可选地显示每个文件的相关信息。
该函数返回目录 directory 中的文件名列表。默认按字母顺序排序。
如果 full-name 非 nil,函数返回文件的绝对文件名;否则返回相对于指定目录的文件名。
如果 match-regexp 非 nil,函数只返回非目录部分匹配该正则表达式的文件名,其他文件名将被排除。在大小写不敏感的文件系统上,正则匹配也不区分大小写。
如果 nosort 非 nil,directory-files 不会对列表排序,返回的文件名顺序随机。如果你追求极致速度且不关心处理顺序,可使用此选项。如果处理顺序对用户可见,排序通常会带来更好体验。
如果 count 非 nil,函数只返回前 count 个文件名,或全部文件(取较少者)。count 必须是大于 0 的整数。
(directory-files "~lewis")
⇒ ("#foo#" "#foo.el#" "." ".."
"dired-mods.el" "files.texi"
"files.texi.~1~")
如果 directory 不是可读取的目录名,会抛出错误。
该工具函数在 directory 是可访问目录且不包含任何文件(即为空目录)时返回 t。在会返回 ‘.’ 和 ‘..’ 的系统上,会忽略这两项。
指向目录的符号链接视为目录。可使用 file-symlink-p 区分符号链接。
返回 directory 下所有名称匹配 regexp 的文件。该函数递归搜索指定目录及其子目录,查找 basename(不含前置目录)匹配正则表达式 regexp 的文件,并返回匹配文件的绝对文件名列表(see absolute file names)。文件名按深度优先顺序返回,即子目录中的文件排在其父目录文件之前。此外,每个子目录中的匹配文件按 basename 字母序排序。默认情况下,名称匹配 regexp 的目录不会出现在列表中;如果可选参数 include-directories 非 nil,则会包含这些目录。
默认会进入所有子目录。如果 predicate 为 t,则忽略进入子目录时发生的错误(例如无权限读取)。如果它既非 nil 也非 t,则应为一个单参数函数(参数为子目录名),返回非 nil 时才进入该目录。
默认不跟随指向子目录的符号链接;如果 follow-symlinks 非 nil,则会跟随。
从 file 开始,向上遍历目录树,查找第一个存在名称为 name(字符串)的目录,并返回该目录。如果 file 是普通文件,则从其所在目录开始搜索;否则 file 应为搜索起始目录。函数依次在起始目录、父目录、祖父目录……中查找,直到找到包含 name 的目录,或到达文件系统根目录仍未找到——后一种情况返回 nil。
参数 name 也可以是一个谓词函数。该函数会对从 file 开始遍历的每个目录调用谓词(即使 file 不是目录),传入一个参数(文件或目录名),返回非 nil 时表示找到目标目录。
如果 file 位于目录 dir 或其子目录中,该函数返回 t。如果 file 与 dir 是同一个目录,也返回 t。函数会比较两者的真实路径。如果 dir 不是已存在目录,则返回 nil。
该函数在筛选文件和处理文件名方式上与 directory-files 类似。但它不返回文件名列表,而是为每个文件返回一个列表 (filename . attributes),其中 attributes 是 file-attributes 对该文件返回的属性结构。可选参数 id-format 的含义与 file-attributes 的对应参数一致(see Definition of file-attributes)。
该正则表达式匹配除 ‘.’ 和 ‘..’ 之外的任何文件名。更精确地说,它匹配任意非空字符串中除这两个名称之外的部分。适合作为 directory-files 和 directory-files-and-attributes 的 match-regexp 参数:
(directory-files "/foo" nil directory-files-no-dot-files-regexp)
如果目录 ‘/foo’ 为空,则返回 nil。
该函数展开通配符模式 pattern,返回匹配的文件名列表。
pattern 默认为 glob / 通配符字符串,例如 ‘"/tmp/*.png"’ 或 ‘"/*/*/foo.png"’;如果可选参数 regexp 非 nil,则 pattern 可作为正则表达式使用。无论哪种方式,匹配都按子目录分别进行,不能跨父子目录匹配。
如果 pattern 是绝对文件名,返回值也为绝对路径。
如果 pattern 是相对文件名,则按当前默认目录解析。返回的文件名通常也相对当前默认目录;但如果 full 非 nil,则返回绝对路径。
该函数在当前缓冲区中插入目录 file 的列表,格式由 ls 根据 switches 控制。执行后光标位于插入文本之后。switches 可以是选项字符串,也可以是表示单个选项的字符串列表。
参数 file 可以是目录或包含通配符的文件说明。如果 wildcard 非 nil,表示将 file 视为带通配符的文件说明。
如果 full-directory-p 非 nil,表示目录列表应显示目录的完整内容。当 file 是目录且选项中不含 ‘-d’ 时应指定为 t。(ls 的 ‘-d’ 选项表示将目录本身作为文件描述,而非显示其内容。)
在大多数系统上,该函数通过运行变量 insert-directory-program 中的程序生成目录列表。如果 wildcard 非 nil,还会运行 shell-file-name 指定的 Shell 以展开通配符。
MS-DOS 和 MS-Windows 通常缺少标准 Unix 程序 ls,因此该函数用 Lisp 代码模拟其行为。
技术细节:当 switches 包含长选项 ‘--dired’ 时,insert-directory 会为 dired 做特殊处理。但通常等价的短选项 ‘-D’ 会像其他普通选项一样直接传给 insert-directory-program。
该用户选项指定为 insert-directory 生成目录列表所运行的程序。在使用 Lisp 代码生成列表的系统上忽略此选项。