diff --git a/Cabal/ChangeLog.md b/Cabal/ChangeLog.md
index b9172939f2cd6a1e95a6817ff110664f9acd0179..2842cb2ecd894ac4206f63cf0f66816649e01122 100644
--- a/Cabal/ChangeLog.md
+++ b/Cabal/ChangeLog.md
@@ -35,6 +35,9 @@
     separate compilation of C-- and ASM source files (#6033).
   * Setting `debug-info` now implies `library-stripping: False` and
     `executable-stripping: False) ([#2702](https://github.com/haskell/cabal/issues/2702))
+  * `Setup.hs copy` and `install` now work in the presence of
+    `data-files` that use `**` syntax
+    ([#6125](https://github.com/haskell/cabal/issues/6125)).
 
 ----
 
diff --git a/Cabal/Distribution/Simple/Install.hs b/Cabal/Distribution/Simple/Install.hs
index 4ecd80beb168b6f66eed3602cebb7f3f583c3426..5dc45924d01e6fbf4d07d59edc167df8af860364 100644
--- a/Cabal/Distribution/Simple/Install.hs
+++ b/Cabal/Distribution/Simple/Install.hs
@@ -223,17 +223,17 @@ copyComponent _ _ _ (CTest _) _ _ = return ()
 --
 installDataFiles :: Verbosity -> PackageDescription -> FilePath -> IO ()
 installDataFiles verbosity pkg_descr destDataDir =
-  flip traverse_ (dataFiles pkg_descr) $ \ file -> do
+  flip traverse_ (dataFiles pkg_descr) $ \ glob -> do
     let srcDataDirRaw = dataDir pkg_descr
         srcDataDir = if null srcDataDirRaw
           then "."
           else srcDataDirRaw
-    files <- matchDirFileGlob verbosity (specVersion pkg_descr) srcDataDir file
-    let dir = takeDirectory file
-    createDirectoryIfMissingVerbose verbosity True (destDataDir </> dir)
-    sequence_ [ installOrdinaryFile verbosity (srcDataDir  </> file')
-                                              (destDataDir </> file')
-              | file' <- files ]
+    files <- matchDirFileGlob verbosity (specVersion pkg_descr) srcDataDir glob
+    for_ files $ \ file' -> do
+      let src = srcDataDir </> file'
+          dst = destDataDir </> file'
+      createDirectoryIfMissingVerbose verbosity True (takeDirectory dst)
+      installOrdinaryFile verbosity src dst
 
 -- | Install the files listed in install-includes for a library
 --
diff --git a/cabal-testsuite/PackageTests/Regression/T6125/Main.hs b/cabal-testsuite/PackageTests/Regression/T6125/Main.hs
new file mode 100644
index 0000000000000000000000000000000000000000..b3549c2fe3d794dddfdf687ed1163ff5302f20e8
--- /dev/null
+++ b/cabal-testsuite/PackageTests/Regression/T6125/Main.hs
@@ -0,0 +1 @@
+main = return ()
diff --git a/cabal-testsuite/PackageTests/Regression/T6125/data/foo/bar.html b/cabal-testsuite/PackageTests/Regression/T6125/data/foo/bar.html
new file mode 100644
index 0000000000000000000000000000000000000000..99fd1d469d9c8b81291de9cea58da18631c07157
--- /dev/null
+++ b/cabal-testsuite/PackageTests/Regression/T6125/data/foo/bar.html
@@ -0,0 +1 @@
+<!DOCTYPE html>Some random data.
diff --git a/cabal-testsuite/PackageTests/Regression/T6125/myprog.cabal b/cabal-testsuite/PackageTests/Regression/T6125/myprog.cabal
new file mode 100644
index 0000000000000000000000000000000000000000..935cdb8b8c3ba9bd1afd2cfd5300dd316db9e516
--- /dev/null
+++ b/cabal-testsuite/PackageTests/Regression/T6125/myprog.cabal
@@ -0,0 +1,9 @@
+cabal-version: 2.4
+name: myprog
+version: 0
+data-files: data/**/*.html
+
+executable myprog
+  build-depends: base
+  main-is: Main.hs
+  default-language: Haskell2010
diff --git a/cabal-testsuite/PackageTests/Regression/T6125/setup.cabal.out b/cabal-testsuite/PackageTests/Regression/T6125/setup.cabal.out
new file mode 100644
index 0000000000000000000000000000000000000000..64e8312ccddeb35814d6a79d6a93a137afab9e3a
--- /dev/null
+++ b/cabal-testsuite/PackageTests/Regression/T6125/setup.cabal.out
@@ -0,0 +1,9 @@
+# Setup configure
+Resolving dependencies...
+Configuring myprog-0...
+# Setup build
+Preprocessing executable 'myprog' for myprog-0..
+Building executable 'myprog' for myprog-0..
+# Setup copy
+Installing executable myprog in <PATH>
+Warning: The directory <ROOT>/setup.cabal.dist/usr/bin is not in the system search path.
diff --git a/cabal-testsuite/PackageTests/Regression/T6125/setup.out b/cabal-testsuite/PackageTests/Regression/T6125/setup.out
new file mode 100644
index 0000000000000000000000000000000000000000..b982a76eccdf43a05b484559e397b866437067ed
--- /dev/null
+++ b/cabal-testsuite/PackageTests/Regression/T6125/setup.out
@@ -0,0 +1,8 @@
+# Setup configure
+Configuring myprog-0...
+# Setup build
+Preprocessing executable 'myprog' for myprog-0..
+Building executable 'myprog' for myprog-0..
+# Setup copy
+Installing executable myprog in <PATH>
+Warning: The directory <ROOT>/setup.dist/usr/bin is not in the system search path.
diff --git a/cabal-testsuite/PackageTests/Regression/T6125/setup.test.hs b/cabal-testsuite/PackageTests/Regression/T6125/setup.test.hs
new file mode 100644
index 0000000000000000000000000000000000000000..aeb2587e70c28cec947c3c0381dda5eed4389ab8
--- /dev/null
+++ b/cabal-testsuite/PackageTests/Regression/T6125/setup.test.hs
@@ -0,0 +1,6 @@
+import Test.Cabal.Prelude
+main = setupAndCabalTest $ do
+    withPackageDb $ do
+        setup "configure" []
+        setup "build" ["myprog"]
+        setup "copy" ["myprog"]