import Data.List
import System.Directory
import System.Posix.Files as PF
import Text.Printf
data StMode
= BlkDev
| CharDev
| Dir
| NamedPipe
| RegFile
| Sock
| SymLink
instance Show StMode
where show BlkDev
= "block device" show CharDev
= "character device" show NamedPipe
= "named pipe" show RegFile
= "regular file" show SymLink
= "symbolic link"
getStMode
:: FilePath
-> IO StMode
getStMode fp =
getSymbolicLinkStatus fp >>=
(\x ->
case () of
_
| isBlockDevice x
-> return BlkDev
| isCharacterDevice x
-> return CharDev
| isNamedPipe x
-> return NamedPipe
| isRegularFile x
-> return RegFile
| PF
.isSymbolicLink x
-> return SymLink
groupByStMode
:: [FilePath
] -> IO [[(FilePath
, StMode
)]]groupByStMode fps = do
stModes
<- mapM getStMode fps
let zipped
= zip fps stModes
sorted
= sortBy
(\
(_, m0
) (_, m1
) -> compare m0 m1
) zipped
grouped = groupBy (\(_, m0) (_, m1) -> m0 == m1) sorted
ls
:: FilePath
-> IO [FilePath
]ls fp
= listDirectory fp
>>= (\list
-> return $ map ((fp
++ "/") ++) list
)
main =
ls "/proc" >>= groupByStMode >>=
(\list ->
let (toShow
, toHide
) = splitAt 10 list
in printf "%-30s%s\n" "path" "type" >>
printf
"%-30s%s" (show $ length toHide
) "omited\n\n")
aW1wb3J0IERhdGEuTGlzdAppbXBvcnQgU3lzdGVtLkRpcmVjdG9yeQppbXBvcnQgU3lzdGVtLlBvc2l4LkZpbGVzIGFzIFBGCmltcG9ydCBUZXh0LlByaW50ZgoKZGF0YSBTdE1vZGUKICAgID0gQmxrRGV2CiAgICB8IENoYXJEZXYKICAgIHwgRGlyCiAgICB8IE5hbWVkUGlwZQogICAgfCBSZWdGaWxlCiAgICB8IFNvY2sKICAgIHwgU3ltTGluawogICAgZGVyaXZpbmcgKEVxLCBPcmQpCgppbnN0YW5jZSBTaG93IFN0TW9kZSB3aGVyZQogICAgc2hvdyBCbGtEZXYgPSAiYmxvY2sgZGV2aWNlIgogICAgc2hvdyBDaGFyRGV2ID0gImNoYXJhY3RlciBkZXZpY2UiCiAgICBzaG93IERpciA9ICJkaXJlY3RvcnkiCiAgICBzaG93IE5hbWVkUGlwZSA9ICJuYW1lZCBwaXBlIgogICAgc2hvdyBSZWdGaWxlID0gInJlZ3VsYXIgZmlsZSIKICAgIHNob3cgU29jayA9ICJzb2NrZXQiCiAgICBzaG93IFN5bUxpbmsgPSAic3ltYm9saWMgbGluayIKCmdldFN0TW9kZSA6OiBGaWxlUGF0aCAtPiBJTyBTdE1vZGUKZ2V0U3RNb2RlIGZwID0KICAgIGdldFN5bWJvbGljTGlua1N0YXR1cyBmcCA+Pj0KICAgIChceCAtPgogICAgICAgICBjYXNlICgpIG9mCiAgICAgICAgICAgICBfCiAgICAgICAgICAgICAgICAgfCBpc0Jsb2NrRGV2aWNlIHggLT4gcmV0dXJuIEJsa0RldgogICAgICAgICAgICAgICAgIHwgaXNDaGFyYWN0ZXJEZXZpY2UgeCAtPiByZXR1cm4gQ2hhckRldgogICAgICAgICAgICAgICAgIHwgaXNOYW1lZFBpcGUgeCAtPiByZXR1cm4gTmFtZWRQaXBlCiAgICAgICAgICAgICAgICAgfCBpc1JlZ3VsYXJGaWxlIHggLT4gcmV0dXJuIFJlZ0ZpbGUKICAgICAgICAgICAgICAgICB8IGlzRGlyZWN0b3J5IHggLT4gcmV0dXJuIERpcgogICAgICAgICAgICAgICAgIHwgUEYuaXNTeW1ib2xpY0xpbmsgeCAtPiByZXR1cm4gU3ltTGluawogICAgICAgICAgICAgICAgIHwgaXNTb2NrZXQgeCAtPiByZXR1cm4gU29jaykKCmdyb3VwQnlTdE1vZGUgOjogW0ZpbGVQYXRoXSAtPiBJTyBbWyhGaWxlUGF0aCwgU3RNb2RlKV1dCmdyb3VwQnlTdE1vZGUgZnBzID0gZG8KICAgIHN0TW9kZXMgPC0gbWFwTSBnZXRTdE1vZGUgZnBzCiAgICBsZXQgemlwcGVkID0gemlwIGZwcyBzdE1vZGVzCiAgICAgICAgc29ydGVkID0gc29ydEJ5IChcKF8sIG0wKSAoXywgbTEpIC0+IGNvbXBhcmUgbTAgbTEpIHppcHBlZAogICAgICAgIGdyb3VwZWQgPSBncm91cEJ5IChcKF8sIG0wKSAoXywgbTEpIC0+IG0wID09IG0xKSBzb3J0ZWQKICAgIHJldHVybiBncm91cGVkCgpscyA6OiBGaWxlUGF0aCAtPiBJTyBbRmlsZVBhdGhdCmxzIGZwID0gbGlzdERpcmVjdG9yeSBmcCA+Pj0gKFxsaXN0IC0+IHJldHVybiAkIG1hcCAoKGZwICsrICIvIikgKyspIGxpc3QpCgptYWluID0KICAgIGxzICIvcHJvYyIgPj49IGdyb3VwQnlTdE1vZGUgPj49CiAgICBtYXBNXwogICAgICAgIChcbGlzdCAtPgogICAgICAgICAgICAgbGV0ICh0b1Nob3csIHRvSGlkZSkgPSBzcGxpdEF0IDEwIGxpc3QKICAgICAgICAgICAgICBpbiBwcmludGYgIiUtMzBzJXNcbiIgInBhdGgiICJ0eXBlIiA+PgogICAgICAgICAgICAgICAgIG1hcE1fIChceCAtPiBwcmludGYgIiUtMzBzJXNcbiIgKGZzdCB4KSAoc2hvdyAkIHNuZCB4KSkgdG9TaG93ID4+CiAgICAgICAgICAgICAgICAgcHJpbnRmICIlLTMwcyVzIiAoc2hvdyAkIGxlbmd0aCB0b0hpZGUpICJvbWl0ZWRcblxuIikK