2013-07-20 46 views
2

SBCL(目錄「*」)正在篩選出一些基於擴展名的文件名。 我如何得到它的所有文件,或者尤其是匹配模式的所有文件返回(如在bash globing)sbcl(目錄「*」)不返回所有文件(例如缺少* .lisp)

(目錄「*」),列出了一些文件,並不是所有 (目錄「MyFile的」) ;列出一些文件,但再次,擴展過濾器

看起來對我的擴展忽略...至少* .lisp未列出。

SBCL 1.1.2-1.fc18在Fedora18

+0

[Here's](http://clhs.lisp.se/Body/f_tr_pn.htm)很多例子+解釋。但是,最重要的是,這種行爲是由實施定義的。所以,雖然大多數實現都會做同樣的事情,但可能會有變化。在使用Unix路徑名時,我一定要用點或斜線開始,以確保它按照我的意圖進行解釋。所以,我會從'./*'或'/ *'開始,並從那裏開始工作。 – 2013-07-21 12:04:47

回答

2

從globs到pathnames的翻譯是實現和系統相關的。路徑名區分文件名文件類型(擴展名)。當您指定*時,Linux上的SBCL將其解釋爲「任何文件名,但擴展名必須爲空」。你可以說*.*指定全部文件。 *.*中的.被解釋爲文件名和擴展名之間的分隔,因此*.*表示而不是只是包含文字點的文件名。

1

Lisp的使用路徑和他們稱之爲.XXX的文件類型。 (目錄「」)是過濾一些‘類型’(我還是不明白這一切), 但freenode.net IRC用戶PJB指出

(concatenate 'list (directory "*.*") (directory "*") (directory "*/")) 

而且越辦越好。 (還不夠完善,但通行和指向正確的方向)

+1

'(concatenate'list ...)'相當於'(append ...)',但第二個似乎更習慣於使用。 – 2013-07-21 12:07:56

4

可能是你應該使用原生形式:

(directory (make-pathname :name :wild :type :wild)) 

由於這一切奇怪的跡象*?.*不增加代碼的可理解性。 Lisp不應該是單行語言。 :)

但是,如果您只想列出目錄中的所有文件,您可以使用cl-fad函數list-directory