SBCL(目录“*”)根据扩展名过滤掉一些文件名。 如何让它返回所有文件,特别是所有匹配模式的文件(如bash globing)
(目录“*”);列出一些文件,而不是全部 (目录“ MyFile ”);列出一些文件,但再次按扩展名过滤
我似乎忽略了扩展......至少* .lisp未列出。
Fedora18上的SBCL 1.1.2-1.fc18
答案 0 :(得分:4)
可能你应该使用原生形式:
(directory (make-pathname :name :wild :type :wild))
因为所有这些奇怪的符号*?.*
都不会增加代码的可理解性。 Lisp不应该是单行语言。 :)
但如果您只想列出目录中的所有文件,则可以使用cl-fad函数list-directory
。
答案 1 :(得分:2)
从globs到路径名的转换是实现和系统相关的。路径名区分文件名和文件类型(扩展名)。当您仅指定*
时,Linux上的SBCL将其解释为“任何文件名,但扩展名必须为空”。您可以说*.*
指定所有文件。 .
中的*.*
被解释为文件名和扩展名之间的分隔,因此*.*
表示不只是包含文字点的文件名。
答案 2 :(得分:1)
Lisp使用路径,并将 .XXX称为文件类型。 (目录“”)正在过滤一些“类型”(我仍然不理解这一切), 但freenode.net IRC用户pjb指出
(concatenate 'list (directory "*.*") (directory "*") (directory "*/"))
这样做会更好。 (仍然不完美,但可以通过并指向正确的方向)