LFTP反向镜像使用exclude参数时误删远程全部文件求助
问题原因与解决办法
核心错误:--delete参数位置错误
你出错的根源是把无参数开关选项--delete放在了--exclude之后、源目录之前,导致LFTP错误地将后续的本地源路径当成--delete的参数,进而完全识别错了同步的源目录和目标目录。此时LFTP认为要同步的源目录是空的,结合--delete(删除远程不存在于本地的文件)的逻辑,就会删除远程服务器上的所有文件。
正确的命令写法
mirror命令的所有选项(包括--delete、--exclude)必须放在源目录和目标目录之前,且--delete作为无参数开关,不能紧跟路径。同时注意LFTP的--exclude默认使用正则表达式,若想用更直观的shell glob匹配,建议改用--exclude-glob。
写法一(正则匹配):
lftp sftp://user:pass@host-p 22 -e 'set sftp:connect-program "ssh -o StrictHostKeyChecking=no -a -x -i /home/.ssh/yourkey.key"; mirror -eRv --delete --exclude "\.vscode/" --exclude ".*\.clpprj" --exclude ".*\.scprj" --exclude "database/scripts/" /media/sparky/Artwork/Web/Sites/space-art.co.uk/ /spaceart; quit;'
写法二(glob匹配,更易读):
lftp sftp://user:pass@host-p 22 -e 'set sftp:connect-program "ssh -o StrictHostKeyChecking=no -a -x -i /home/.ssh/yourkey.key"; mirror -eRv --delete --exclude-glob .vscode/ --exclude-glob *.clpprj --exclude-glob *.scprj --exclude-glob database/scripts/ /media/sparky/Artwork/Web/Sites/space-art.co.uk/ /spaceart; quit;'
补充说明
- PHP调用脚本的代码本身没有问题,只要修正shell脚本中的LFTP命令即可正常运行。
- 使用
--exclude-glob时,无需转义特殊字符(如.、*),写法和普通shell通配符一致,更符合日常使用习惯。
内容的提问来源于stack exchange,提问作者Mark Garlick
相关产品推荐
相关产品推荐

