/var/www/html/test/
ソースからターゲットにすべてのファイルとディレクトリをコピーする必要があります/var/www/html/test2/
。ソースからファイルをコピーした後、削除する必要がある追加のファイルとフォルダがターゲットに既に存在する可能性があります。
コピーする前にターゲットの内容をすべて削除することはできません。
修正する
私は以下を試しました:
cp
1) コマンドを使用してソースからターゲットにファイルをコピーする
cp -R source destination
うまくいきます。
2) ターゲットファイルのすべてのファイルを繰り返して、ファイルがソースに存在することを確認しました。ファイルがターゲットから削除されていない場合
for file in /var/www/html/test2/*;
do filestr=`basename $file`;echo $file;
if [ `ls /var/www/test1/ | grep -c $filestr` -eq 0 ];
then rm $file; fi;
done;
ターゲットのルートファイルにのみ適用されます。
ソースと一致する場合は、すべてのファイルとディレクトリを再帰的に確認する方法を理解する必要があります。
答え1
これは典型的なユースケースですrsync
。rsync
ディレクトリツリーがソースから宛先にコピーされます。重複したアイテムを削除するように要求することもできます。その他コピーされたファイル:
rsync -a -v --delete-after /var/www/html/test/ /var/www/html/test2
/
末尾のソース仕様を参照してください。これを省略すると、不要なソースディレクトリ自体がコピーされます。
静かにしたい場合は削除してください-v
。ファイルが大きくて圧縮可能な場合は、ファイルを追加して圧縮して-z
解凍できますが、そうすることで多くの利点が得られるかどうか疑問です。この--delete-after
オプションは、ターゲット上の重複したファイルとフォルダのみを削除しますが、削除しません。後ろに他のファイルはコピーされました。
使用の利点は、rsync
同じファイル(つまり、すでに存在し、実際に一致するファイル)をコピーする必要がないことです。
答え2
#!/bin/bash
SOURCE="/var/www/html/test/"
DESTINATION="/var/www/html/test2/"
cp -pRu "$SOURCE*" "$DESTINATION"
HITSDIR=`find $DESTINATION -type d | sed -e 's|'$DESTINATION'\(.*\)|\1|g'`
for i in $HITSDIR; do
if [ -e $SOURCE$i ]; then
echo Yes $SOURCE$i exists
else
echo Nope delete $DESTINATION$i.
#rm -r $DESTINATION$i
fi
done
HITSFILES=`find $DESTINATION -type f | sed -e 's|'$DESTINATION'\(.*\)|\1|g'`
for i in $HITSFILES; do
if [ -e $SOURCE$i ]; then
echo Yes $SOURCE$i exists
else
echo Nope delete $DESTINATION$i.
#rm $DESTINATION$i
fi
done
これにより、必要に応じて機能します。テストを実行した後、rmのコメントを外すだけです。