Skip to content

Instantly share code, notes, and snippets.

@fujimura
Created February 8, 2014 08:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fujimura/8878486 to your computer and use it in GitHub Desktop.
Save fujimura/8878486 to your computer and use it in GitHub Desktop.
module S3.Ls
( ls
) where
import Control.Applicative ((<*))
import Control.Exception (throwIO)
import System.Process (readProcessWithExitCode)
import Text.Parsec
import Text.Parsec.String
newtype S3Object = S3Object (String, String, String) deriving (Eq,Show)
ls :: String -> IO [S3Object]
ls bucketName = do
(_,ok,ng) <- readProcessWithExitCode "s3cmd" ["ls", "s3://" ++ bucketName] []
if ok == ""
then throwIO $ userError $ "No bucket found" ++ " " ++ "(" ++ bucketName ++ ")"
else return $ parseResult ok
result = many line <* eof
parseResult :: String -> [S3Object]
parseResult str = case parse result "ERROR" str of
Left l -> error $ show l
Right xs -> xs
line :: Parser S3Object
line = do
date <- manyTill anyChar (try (string " "))
size <- manyTill anyChar (try (string " "))
string "s3://"
name <- manyTill anyChar (try (char '\n'))
return $ S3Object (date, size, name)
@fujimura
Copy link
Author

fujimura commented Feb 8, 2014

λ ls "fujimuradaisuke"
[S3Object ("2013-12-27 10:34","6346592","fujimuradaisuke/index (1).tar.gz"),S3Object ("2013-12-27 10:32","6344285","fujimuradaisuke/index.tar.gz"),S3Object ("2013-10-29 13:34","  83864","fujimuradaisuke/otaru.jpg")]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment