Filtern Sie eine Liste von Pfaden, um nur Dateien einzuschließen

Wenn ich eine Liste von @ haFilePaths, wie kann ich sie filtern, um nur diejenigen zurückzugeben, die reguläre Dateien sind (dh keine Symlinks oder Verzeichnisse)?

Zum Beispiel mitgetDirectoryContents

main = do
    contents <- getDirectoryContents "/foo/bar"
    let onlyFiles = filterFunction contents in
        print onlyFiles

where "filterFunction" ist eine Funktion, die nur das @ zurückgiFilePaths, die Dateien darstellen.

Die Antwort funktioniert möglicherweise nur unter Linux, die plattformübergreifende Unterstützung wird jedoch bevorzugt.

[EDIT] Die Verwendung von doesDirectoryExist funktioniert nicht wie erwartet. Dieses Skript gibt eine Liste aller Elemente im Verzeichnis aus, nicht nur der Dateien:

module Main where

import System.Directory
import Control.Monad (filterM, liftM)

getFiles :: FilePath -> IO [FilePath]
getFiles root = do
    contents <- getDirectoryContents root
    filesHere <- filterM (liftM not . doesDirectoryExist) contents
    subdirs <- filterM doesDirectoryExist contents
    return filesHere

main = do
    files <- getFiles "/"
    print $ files

Zusätzlich enthalten die variablen Unterverzeichnisse nur"." und"..".

Antworten auf die Frage(8)

Ihre Antwort auf die Frage