0

I want to copy (overwrite) folders from one directory to another set of directories, only if the folders in directory1 exist in directory2.

For example, I have stored some folders in my home directory:

home
    |admin
        |updates
            |package1
            |package2
            |package3

I also have another folder with builds of an app:

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

I want the 'package1', 'package2', 'package3' folders found in '/home/updates/package' directory to be copied over to the 'packages' folders found recursively in '/home/builds' directory, but only if the folders already exist.

So in the example above, 'package1'/'package2'/'package3' would be copied into '/home/builds/build1/packages'. Only 'package1' would be copied into '/home/builds/build3/rev1/packages' ('package2'/'package3' would not because it doesn't exist there).

In addition, 'build1'/'build2'/'build3' may have different owner/group permissions so I would like to retain the relative target directory's permissions.

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

run this command

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

Greetings

  • Thank you, this is awesome! I just need to find a way to preserve the target permissions; might just store them at the beginning of the script and then reapply them after the files are copied over. Many thanks! – rabbithole_afx Aug 27 at 14:26
0
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 - iterate through the names of the folders

  • find /home/ -name $i -type d - recursively find all the folders with said names in the /home/ directory

  • -not -path "/home/admin/updates/$i" - exclude from find results the original directory

  • -exec cp /home/admin/updates/$i/* {} \; - execute the command - copy files from original folder to found folder

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.