フォルダがすでに存在する場合にのみ、フォルダを別のディレクトリセットにコピーします。

フォルダがすでに存在する場合にのみ、フォルダを別のディレクトリセットにコピーします。

ディレクトリ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/* {} \;- コマンドの実行 - ソースフォルダから見つかったフォルダにファイルをコピーする

関連情報