我的问题:
如何确保 LFTP 只包含文件和 目录使用--include
或--include-glob
,而不是从远程根目录下载一堆不在包含范围内的额外目录?
一些背景:
我正在使用 LFTP 和镜像来下载站点文件,但我只想下载某些文件和目录。因此,我为 LFTP 提供了一些包含和排除,以便从远程服务器的根目录运行。
根据 LFTP man 的说法,我的理解是,如果您指定包含,它将仅包含您告诉它的所有文件,然后将排除应用到包含规则。这对于根目录中的文件来说非常完美,并且不会下载任何未包含的文件...但是,它会下载根目录中的所有目录,而不仅仅是我要求它包含的目录。
我怀疑我在使用--include
和时遇到问题--include-glob
...无论我在两者(glob 或正则表达式)之间尝试过什么,我都无法让 LFTP 镜像不下载我在包含内容中指定的目录之外的目录。
这是我的 bash 脚本(对于 bash 脚本来说有点新)
#!/bin/bash
# Credentials
protocol="ftp" # ftp or sftp
host="host"
user="user"
pass="pass"
localcd="/path/to/localdir"
remotecd="/remotedir"
# Set up FTP URL
ftpurl="$protocol://$user:$pass@$host"
# Default includes - helps only include core files in root in case there are other random files
includes="--include-glob wp-admin/*" # other dirs are still being downloaded with these three
includes+=" --include-glob wp-content/*"
includes+=" --include-glob wp-includes/*"
includes+=" --include ^wp-.*\.php$" # works just fine
includes+=" --include ^index.php$" # works just fine
includes+=" --include ^xmlrpc.php$" # works just fine
# Exclude hidden files/directories
excludes="--exclude-glob .*"
excludes+=" --exclude-glob .*/"
# LFTP sets
lftp_sets="set cmd:fail-exit yes;"
if [ "$protocol" == "ftp" ]
then
lftp_sets+=" set ftp:ssl-allow no;"
fi
# Run the LFTP
lftp -e "$lftp_sets
open '$ftpurl';
lcd $localcd;
cd $remotecd;
mirror --continue --only-newer --delete --verbose=3 --no-perms --parallel=8 $includes $excludes"
我试过了
includes="--include ^wp-.*/.**"
和
includes="--include ^wp-admin/.*"
includes+="--include ^wp-content/.*"
includes+="--include ^wp-includes/.*"
还有更多的变化,我无法数清。我在 google 上搜索到的有关 LFTP 镜像 4 页深的所有内容都有一个紫色链接。 :(
答案1
操作顺序。
您首先需要排除,然后是包含。
此示例排除所有内容,然后包含某些文件夹,然后排除包含的这些文件夹中的文件。
mirror --exclude '.*' --exclude '.*/' --include 'v*-stable/' -X '*.src.rpm'
在你的情况下
mirror --continue --only-newer --delete --verbose=3 --no-perms --parallel=8 $excludes $includes"