我需要将所有文件和目录从源复制/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 即可。