仅当文件夹已存在时,将文件夹复制到另一组目录

仅当文件夹已存在时,将文件夹复制到另一组目录

我想将文件夹从一个目录复制(覆盖)到另一组目录,前提是目录 1 中的文件夹存在于目录 2 中。

例如,我在我的主目录中存储了一些文件夹:

home
    |admin
        |updates
            |package1
            |package2
            |package3

我还有另一个包含应用程序构建的文件夹:

home
    |builds
        |build1
            |packages
                |package1
                |package2
                |package3
        |build2
            |packages
                |package1
                |package3
        |build3
            |rev1
                |packages
                    |package1
            |rev2
                |packages
                    |package2

我希望将“/home/updates/package”目录中找到的“package1”、“package2”、“package3”文件夹复制到“/home/builds”目录中递归找到的“packages”文件夹,但前提是这些文件夹已经存在。

因此,在上面的示例中,“package1”/“package2”/“package3”将被复制到“/home/builds/build1/packages”中。只有“package1”会被复制到“/home/builds/build3/rev1/packages”中(“package2”/“package3”不会被复制,因为它在那里不存在)。

此外,“build1”/“build2”/“build3”可能具有不同的所有者/组权限,因此我想保留相对目标目录的权限。

答案1

mkdir -p test/updates/pack1
...
mkdir -p test/builds/builds1/packages/pack3
...
touch test/updates/pack1/f1-1
...

运行这个命令

find test/builds -type d  -name packages -exec bash -c 'for pk in "$1"/pack* ; do cp -r test/updates/"${pk##*/}" $1 ; done' none {} \;

问候

答案2

for i in package1 package2 package3; do find /home/ -name $i -type d -not -path "/home/admin/updates/$i" -exec cp /home/admin/updates/$i/* {} \;; done
  • for i in package1 package2 package3; ... ; done- 遍历文件夹的名称

  • find /home/ -name $i -type d- 递归查找 /home/ 目录中具有上述名称的所有文件夹

  • -not -path "/home/admin/updates/$i"- 从查找结果中排除原始目录

  • -exec cp /home/admin/updates/$i/* {} \;- 执行命令 - 将文件从原始文件夹复制到找到的文件夹

相关内容