module GroupByDate where import qualified System.Directory as Dir import qualified System.PosixCompat.Files as Files import qualified System.FilePath as FilePath import System.FilePath ((), ) import HsShellScript.Shell (shell_quote, ) import qualified Data.Time.Format as Time import Data.Time.Clock.POSIX (posixSecondsToUTCTime, ) import Text.Printf (printf, ) import Control.Monad (when, ) folderFromStatus :: String -> Files.FileStatus -> FilePath folderFromStatus fmt = Time.formatTime Time.defaultTimeLocale fmt . posixSecondsToUTCTime . realToFrac . Files.modificationTime folderFromPath :: String -> FilePath -> IO FilePath folderFromPath fmt = fmap (Time.formatTime Time.defaultTimeLocale fmt) . Dir.getModificationTime makeDstPath :: FilePath -> FilePath -> FilePath makeDstPath src dst = dst FilePath.takeFileName src commandFromPath :: Bool -> String -> String -> FilePath -> IO () commandFromPath fullDst cmd fmt src = do dst <- folderFromPath fmt src printf "mkdir -p %s && %s %s %s\n" (shell_quote dst) cmd (shell_quote src) (shell_quote $ if fullDst then makeDstPath src dst else dst) movePath :: String -> FilePath -> IO () movePath fmt src = do dst <- folderFromPath fmt src Dir.createDirectoryIfMissing True dst Dir.renameFile src (makeDstPath src dst) copyPath :: String -> FilePath -> IO () copyPath fmt src = do dstDir <- folderFromPath fmt src Dir.createDirectoryIfMissing True dstDir let dst = makeDstPath src dstDir Dir.copyFile src dst status <- Files.getFileStatus src Files.setFileTimes dst (Files.accessTime status) (Files.modificationTime status) when False $ -- this could fail, if the owner is 'root' e.g. for data on removeable media Files.setOwnerAndGroup dst (Files.fileOwner status) (Files.fileGroup status) symLinkPath :: String -> FilePath -> IO () symLinkPath fmt src = do dst <- folderFromPath fmt src Dir.createDirectoryIfMissing True dst Files.createSymbolicLink src (makeDstPath src dst)