編集:重複ソリューションが見つかりました:rsync -a --delete https://stackoverflow.com/questions/23698183/how-to-force-cp-to-overwrite-directory-instead-of-creating-another-one-inside
動作する新しいスクリプト:
#!/bin/bash
numCopy=$1
shift
cmdline="${@}"
echo "prepare folders"
for ((i=1;i<=$numCopy;i++));
do
(rsync -a --delete $cmdline/ $cmdline$i/; ) &
(echo "preparing folder clone: $i") &
done
wait
マルチスレッドフォルダコピーの場合、
#!/bin/bash
numCopy=$1
shift
cmdline="${@}"
echo "prepare folders"
for ((i=1;i<=$numCopy;i++));
do
(cp -rf $cmdline $cmdline$i; ) &
(echo "preparing folder clone: $i") &
done
wait
スクリプトは、マイコンピュータに問題なくソースフォルダを$cmdline
(存在しない)ターゲットにコピーします。$cmdline$i
Ubuntu16.04しかし、クラウドマシンで同じスクリプトを実行すると、Ubuntu18.04、これは次のことを行います。
- ソースをターゲットにコピーする(これだけが必要です)
- また、ソースをターゲットにコピーします。 (
destination/source
私はこれをしたくない)
これはプログラムを中断しませんが、不要なクラウドスペースを消費したくありません。
他のバージョンのUbuntuがターゲットフォルダにセカンダリコピーを追加するのはなぜですか?
私はこのスクリプトを次のように使用します。
./myscript.sh 2 foldertest
これにより、フォルダテストがフォルダテスト1とフォルダテスト2にコピーされます。最初の引数が32の場合、最大foldertest32まで32のコピーを作成します。
cp のドキュメントに -r は再帰コピーのためのものであると示されています。これは、WindowsまたはUbuntuグラフィックターミナルからコピーして貼り付けるのと同じように、ソースフォルダの完全な複製を実行するために必要です(フォルダ2、フォルダ3の作成...場所)。また、最大64個のクローンを作成し、すでに64個のクローンがある場合は、64個の質問に答えたくないので、尋ねずにファイルを強制的にコピーするように-fを追加しました。
必要な動作に関する追加情報は次のとおりです。
フォルダA:a.txt b.txt c.txt
フォルダA1、A2、A3、A4..は次のとおりです。
a.txt
b.txt
c.txt
しかし、それは:
a.txt
b.txt
c.txt
A
通常、ファイルをファイルにコピーすると、ファイルが存在する場合は上書きされます。コピーする代わりに、フォルダに対して同じ上書き動作が必要です。
ベストアンサー1
cp -rf source dest
すでに存在する場合、dest
結果は異なります。
- 存在しない場合は、名前付きコピーが
dest
作成されます。ファイルが含まれていると仮定すると、ファイルが作成されます。source
dest
source
f1
dest/f1
dest
ディレクトリとして存在し、名前付きdest
ファイルが存在しない場合は、その内容をすべてsource
コピーします。source
入力するdest
。上記の例を使用するとdest/source/f1
。dest
ファイルとして存在し、ディレクトリsource
の場合、コピーは失敗します。dest
ディレクトリとして存在し、名前がdest
。source
dest
ファイルとして存在する場合source
、ファイルの場合はdest
内容で上書きされますsource
。
既存の宛先ディレクトリを削除するには、(cp -rf $cmdline $cmdline$i; ) &
に変更できます(rm -rf $cmdline$i && cp -rf $cmdline $cmdline$i; ) &
。