import Data.List import Magic import System.Directory magic = magicOpen [MagicMimeType] getMimeType :: [FilePath] -> IO [String] getMimeType fps = magic >>= (\m -> magicLoadDefault m >> mapM (magicFile m) fps) groupByMime :: [FilePath] -> IO [[(FilePath, String)]] groupByMime fps = do mimes <- getMimeType fps let zipped = zip fps mimes srted = sortBy (\(_, m0) (_, m1) -> compare m0 m1) zipped grped = groupBy (\(_, m0) (_, m1) -> m0 == m1) srted return grped ls :: FilePath -> IO [FilePath] ls fp = listDirectory fp >>= (\list -> return $ map ((fp ++ "/") ++) list) fillTo :: Int -> String -> String fillTo n xs | xsLen >= n = xs | otherwise = xs ++ (replicate (n - xsLen) ' ') where xsLen = length xs main = ls "/proc" >>= groupByMime >>= mapM_ (\list -> let (sh, hd) = splitAt 10 list in putStrLn (fillTo 30 "path" ++ "type") >> mapM_ (\x -> putStrLn $ fillTo 30 (fst x) ++ (snd x)) sh >> putStrLn (fillTo 30 (show $ length hd) ++ "omited.\n"))