ディレクトリ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 {} \;
- 「見つけよう」という意志再帰検索「パッケージ」ディレクトリの場合。
- '-exec bash -c'が実行されます「検索」結果のバッチ処理。
- bash 'for'ループはターゲットから既存の「packX」を検索し、それをソースからコピーします(次を使用)。パラメータ。拡大する)目的地まで。
挨拶
答え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/* {} \;
- コマンドの実行 - ソースフォルダから見つかったフォルダにファイルをコピーする