Vis*_*rma 3 linux shell-script file-copy
我需要将所有文件和目录从 source 复制/var/www/html/test/到 destination /var/www/html/test2/。目标可能已经有额外的文件和文件夹,我需要在从源复制文件后删除这些文件和文件夹。
在复制之前,我无法从目标中删除所有内容。
更新
我试过以下:
1)使用cp命令将文件从源复制到目标
cp -R source destination
Run Code Online (Sandbox Code Playgroud)
哪个工作正常。
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;
Run Code Online (Sandbox Code Playgroud)
仅适用于目标中的根文件。
需要找出如何递归检查与源匹配的所有文件和目录。
这是rsync. rsync将目录树从源复制到目标。复制后也可以要求删除多余的其他文件:
rsync -a -v --delete-after /var/www/html/test/ /var/www/html/test2
Run Code Online (Sandbox Code Playgroud)
请注意/源规范的尾随。如果你省略这个,它会复制你不需要的源目录本身。
如果您希望它安静,请删除-v. 如果文件很大且可压缩,您可能想尝试添加-z以使其进行压缩和解压缩,但我怀疑它会获得多少收益。该--delete-after选项仅从目标中删除多余的文件和文件夹,但在复制其他文件后才会删除。
使用的好处rsync是它不会打扰复制相同的文件(即已经存在并且实际匹配的文件)。
#!/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
Run Code Online (Sandbox Code Playgroud)
这应该可以满足您的要求,只需在进行空运行后取消注释 rm 即可。
| 归档时间: |
|
| 查看次数: |
9783 次 |
| 最近记录: |