import Data.List import System.Directory import System.Environment import System.FilePath.Glob import System.FilePath.Posix usage :: IO () usage = do progName <- getProgName putStrLn ("Usage:\n\t" ++ progName ++ " \"srcPattern\" \"dstPattern\"") hasWildcard :: [Char] -> Bool hasWildcard name = 1 == (length $ filter (\x -> x == '*') name) bruteIndex e l = case (elemIndex e l) of Just x -> x Nothing -> 0 trimHeadTail s pre pos = let nohead = drop (length pre) s in reverse (drop (length pos) (reverse nohead)) partRename preL posL preR posR name = let fn = takeFileName name in renameFile fn (preR ++ (trimHeadTail fn preL posL) ++ posR) batchRename :: [Char] -> [Char] -> IO () batchRename left right = if hasWildcard left && hasWildcard right then let wildcardLeftIndex = bruteIndex '*' left oldPreLeft = take wildcardLeftIndex left oldPosLeft = drop (wildcardLeftIndex + 1) left wildcardRightIndex = bruteIndex '*' right oldPreRight = take wildcardRightIndex right oldPosRight = drop (wildcardRightIndex + 1) right in do files <- glob left sequence_ (map (partRename oldPreLeft oldPosLeft oldPreRight oldPosRight) files) else putStrLn "Oops, use simple rename please." main :: IO () main = do args <- System.Environment.getArgs case args of [l,r] -> batchRename l r otherwise -> usage