packages feed

batch-rename-0.1.1.0: batchRename.hs

import Data.List
import Data.Maybe
import System.Directory
import System.Environment
import System.FilePath.Glob
import System.FilePath

usage :: IO ()
usage = do progName <- getProgName
           putStrLn ("Usage:\n\t" ++ progName ++ " \"srcPattern\" \"dstPattern\"")

hasWildcard :: String -> Bool
hasWildcard name = 1 == length (filter (== '*') name)

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)

fetchPrePos s = let idx = fromMaybe 0 (elemIndex '*' s) in
  (take idx s, drop (idx + 1) s)

batchRename :: String -> String -> IO ()
batchRename left right = if hasWildcard left && hasWildcard right then
                           let (oldPreLeft, oldPosLeft) = fetchPrePos left
                               (oldPreRight, oldPosRight) = fetchPrePos right in
                             do files <- glob left
                                mapM_ (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