diff --git a/app/App/Commands/Cp.hs b/app/App/Commands/Cp.hs
--- a/app/App/Commands/Cp.hs
+++ b/app/App/Commands/Cp.hs
@@ -24,6 +24,7 @@
 import qualified Data.Text                     as T
 import qualified Data.Text.IO                  as TIO
 import qualified HaskellWorks.Data.Uri.IO.Lazy as URI
+import qualified System.Exit                   as IO
 import qualified System.IO                     as IO
 import qualified System.IO.Unsafe              as IO
 
@@ -41,13 +42,13 @@
 
     case lbsResult of
       Right lbs -> void $ URI.writeResource envAws output lbs
-      Left msg  -> return ()
-
-    return ()
+      Left _    -> throwError "Copy failed"
 
   case result of
     Right _  -> return ()
-    Left msg -> TIO.hPutStrLn IO.stderr (displayUriError msg)
+    Left msg -> do
+      TIO.hPutStrLn IO.stderr (displayUriError msg)
+      IO.exitFailure
 
 optsCp :: Parser Z.CpOptions
 optsCp = Z.CpOptions
diff --git a/hw-uri.cabal b/hw-uri.cabal
--- a/hw-uri.cabal
+++ b/hw-uri.cabal
@@ -1,7 +1,7 @@
 cabal-version:          2.4
 
 name:                   hw-uri
-version:                0.1.1.6
+version:                0.1.1.7
 synopsis:               Supports IO on URIs
 description:            Supports IO on URIs.
 homepage:               https://github.com/haskell-works/hw-uri
diff --git a/src/HaskellWorks/Data/Uri/IO/Lazy.hs b/src/HaskellWorks/Data/Uri/IO/Lazy.hs
--- a/src/HaskellWorks/Data/Uri/IO/Lazy.hs
+++ b/src/HaskellWorks/Data/Uri/IO/Lazy.hs
@@ -18,6 +18,7 @@
   , readHttpUri
   , removePathRecursive
   , listResourcePrefix
+  , deleteResource
   ) where
 
 import Antiope.Core
@@ -238,4 +239,13 @@
 listResourcePrefix envAws location = case location of
   S3 s3Uri   -> fmap S3 <$> runAws envAws (AWS.lsPrefix (s3Uri ^. the @"bucket") (s3Uri ^. the @"objectKey" . the @1))
   Local path -> fmap Local <$> lift (FIO.listFilesRecursiveWithPrefix path)
-  HttpUri _  -> throwError "HTTP PUT method not supported"
+  HttpUri _  -> throwError "HTTP method not supported"
+
+deleteResource :: MonadResource m => AWS.Env -> Location -> ExceptT UriError m ()
+deleteResource envAws location = case location of
+  S3 s3Uri        -> do
+    result <- runAws envAws $ AWS.deleteFiles (s3Uri ^. the @"bucket") [s3Uri ^. the @"objectKey"]
+    when (result /= [s3Uri]) $ throwError $ DeleteFailed (tshow location)
+  Local path      -> liftIO $ IO.removeFile path
+  HttpUri _ -> throwError "HTTP method not supported"
+
diff --git a/src/HaskellWorks/Data/Uri/UriError.hs b/src/HaskellWorks/Data/Uri/UriError.hs
--- a/src/HaskellWorks/Data/Uri/UriError.hs
+++ b/src/HaskellWorks/Data/Uri/UriError.hs
@@ -24,6 +24,7 @@
     }
   | RetriesFailedUriError
   | NotFound
+  | DeleteFailed Text
   | GenericUriError Text
   deriving (Eq, Show, Generic)
 
