将整个文件夹从源复制到目标,并从目标中删除多余的文件或文件夹

将整个文件夹从源复制到目标,并从目标中删除多余的文件或文件夹

我需要将所有文件和目录从源复制/var/www/html/test/到目标/var/www/html/test2/。目标可能已经有额外的文件和文件夹,我需要在从源复制文件后将其删除。

在复制之前我无法删除目标中的所有内容。

更新

我尝试了以下操作:

cp1)使用命令将文件从源复制到目标

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

这是 的一个经典用例rsyncrsync会将目录树从源复制到目标。也可以要求删除多余的其他复制后的文件:

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 即可。

相关内容