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 =
getFileStatus 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")
aW1wb3J0IERhdGEuTGlzdAppbXBvcnQgU3lzdGVtLkRpcmVjdG9yeQppbXBvcnQgU3lzdGVtLlBvc2l4LkZpbGVzIGFzIFBGCmltcG9ydCBUZXh0LlByaW50ZgpkYXRhIFN0TW9kZQogICAgPSBCbGtEZXYKICAgIHwgQ2hhckRldgogICAgfCBEaXIKICAgIHwgTmFtZWRQaXBlCiAgICB8IFJlZ0ZpbGUKICAgIHwgU29jawogICAgfCBTeW1MaW5rCiAgICBkZXJpdmluZyAoRXEsIE9yZCkKaW5zdGFuY2UgU2hvdyBTdE1vZGUgd2hlcmUKICAgIHNob3cgQmxrRGV2ID0gImJsb2NrIGRldmljZSIKICAgIHNob3cgQ2hhckRldiA9ICJjaGFyYWN0ZXIgZGV2aWNlIgogICAgc2hvdyBEaXIgPSAiZGlyZWN0b3J5IgogICAgc2hvdyBOYW1lZFBpcGUgPSAibmFtZWQgcGlwZSIKICAgIHNob3cgUmVnRmlsZSA9ICJyZWd1bGFyIGZpbGUiCiAgICBzaG93IFNvY2sgPSAic29ja2V0IgogICAgc2hvdyBTeW1MaW5rID0gInN5bWJvbGljIGxpbmsiCmdldFN0TW9kZSA6OiBGaWxlUGF0aCAtPiBJTyBTdE1vZGUKZ2V0U3RNb2RlIGZwID0KICAgIGdldEZpbGVTdGF0dXMgZnAgPj49CiAgICAoXHggLT4KICAgICAgICAgY2FzZSAoKSBvZgogICAgICAgICAgICAgXwogICAgICAgICAgICAgICAgIHwgaXNCbG9ja0RldmljZSB4IC0+IHJldHVybiBCbGtEZXYKICAgICAgICAgICAgICAgICB8IGlzQ2hhcmFjdGVyRGV2aWNlIHggLT4gcmV0dXJuIENoYXJEZXYKICAgICAgICAgICAgICAgICB8IGlzTmFtZWRQaXBlIHggLT4gcmV0dXJuIE5hbWVkUGlwZQogICAgICAgICAgICAgICAgIHwgaXNSZWd1bGFyRmlsZSB4IC0+IHJldHVybiBSZWdGaWxlCiAgICAgICAgICAgICAgICAgfCBpc0RpcmVjdG9yeSB4IC0+IHJldHVybiBEaXIKICAgICAgICAgICAgICAgICB8IFBGLmlzU3ltYm9saWNMaW5rIHggLT4gcmV0dXJuIFN5bUxpbmsKICAgICAgICAgICAgICAgICB8IGlzU29ja2V0IHggLT4gcmV0dXJuIFNvY2spCmdyb3VwQnlTdE1vZGUgOjogW0ZpbGVQYXRoXSAtPiBJTyBbWyhGaWxlUGF0aCwgU3RNb2RlKV1dCmdyb3VwQnlTdE1vZGUgZnBzID0gZG8KICAgIHN0TW9kZXMgPC0gbWFwTSBnZXRTdE1vZGUgZnBzCiAgICBsZXQgemlwcGVkID0gemlwIGZwcyBzdE1vZGVzCiAgICAgICAgc29ydGVkID0gc29ydEJ5IChcKF8sIG0wKSAoXywgbTEpIC0+IGNvbXBhcmUgbTAgbTEpIHppcHBlZAogICAgICAgIGdyb3VwZWQgPSBncm91cEJ5IChcKF8sIG0wKSAoXywgbTEpIC0+IG0wID09IG0xKSBzb3J0ZWQKICAgIHJldHVybiBncm91cGVkCmxzIDo6IEZpbGVQYXRoIC0+IElPIFtGaWxlUGF0aF0KbHMgZnAgPSBsaXN0RGlyZWN0b3J5IGZwID4+PSAoXGxpc3QgLT4gcmV0dXJuICQgbWFwICgoZnAgKysgIi8iKSArKykgbGlzdCkKbWFpbiA9CiAgICBscyAiL3Byb2MvIiA+Pj0gZ3JvdXBCeVN0TW9kZSA+Pj0KICAgIG1hcE1fCiAgICAgICAgKFxsaXN0IC0+CiAgICAgICAgICAgICBsZXQgKHRvU2hvdywgdG9IaWRlKSA9IHNwbGl0QXQgMTAgbGlzdAogICAgICAgICAgICAgIGluIHByaW50ZiAiJS0zMHMlc1xuIiAicGF0aCIgInR5cGUiID4+CiAgICAgICAgICAgICAgICAgbWFwTV8gKFx4IC0+IHByaW50ZiAiJS0zMHMlc1xuIiAoZnN0IHgpIChzaG93ICQgc25kIHgpKSB0b1Nob3cgPj4KICAgICAgICAgICAgICAgICBwcmludGYgIiUtMzBzJXMiIChzaG93ICQgbGVuZ3RoIHRvSGlkZSkgIm9taXRlZFxuXG4iKQ==