import Control.Monad ((>=>)) import Data.Maybe (listToMaybe) import System.Directory (doesDirectoryExist, listDirectory) import System.Environment (getArgs) import System.FilePath (()) ll :: FilePath -> IO [FilePath] ll p = do b <- doesDirectoryExist p if b then do l <- listDirectory p concat <$> mapM (ll . (p )) (p : l) else pure [p] main :: IO () main = getArgs >>= maybe (pure ()) (ll >=> mapM_ putStrLn) . listToMaybe