wget 没有获取完整的目录列表

wget 没有获取完整的目录列表

我到处寻找,但还是没能找到问题的答案。我不确定这是否是合适的论坛,但我希望这里有人能提供帮助。

我一直使用 wget (FTP) 将我的网站备份到本地硬盘,使用镜像选项,一直没有问题,直到最近。最近,一个包含图像的目录达到了托管服务设置的 FTP 列表中可以包含的项目数的限制。我没有该帐户的 SSL 访问权限。

我可以在远程服务器上运行脚本,并在文件中获取完整的目录列表(ls),然后将其下载到我的本地机器。

是否可以将此文件提供给 wget,并让其将这些文件镜像到我的本地驱动器,就像在达到列表限制之前所做的那样?我希望 wget 读取生成的列表并检查更改和添加的文件。以下是我无法找到答案的问题:

1) 生成所需信息的正确 ls 命令是什么?目前,我仅获取实际的文件名,但我确信还需要更多信息。

2) 带镜像选项的 wget 是否仍能处理输入文件,还是它只会下载输入文件中的所有文件而不检查更改的状态?我完全没有找到有关此组合的任何信息 - 只找到其中​​一个。我不想测试并最终获得目录的完整备份 - 浪费带宽和时间来下载所有数据。

答案1

你可以做到这一点,唯一的问题是从ls在远程和本地机器上是相同的。我的 ls 有一个选项 --时间样式=+%s它显示了文件自纪元以来的最后修改时间(以秒为单位),两台机器上的时间应该一致。我假设您只想对一个目录执行此操作,否则find如果您有该命令会更合适。

在远程执行所需目录中的 ls 到文件中:

cd ... # cd to the directory to list
ls -l --time-style=+%s . >/tmp/listfile

在本地机器上,将远程复制/tmp/listfile到本地/tmp/listfile,然后使用 awk抑制输出的前 4 列并对文件大小、日期和文件名列表进行排序。(我假设您的文件名可能带有空格,因此会出现奇怪的 awk)。

awk '{$1="";$2="";$3="";$4="";print}' </tmp/listfile | sort >/tmp/a

在镜像目录中获取相同的列表:

cd ... # cd to same directory we listed remotely
ls -l --time-style=+%s . | awk '{$1="";$2="";$3="";$4="";print}' | sort >/tmp/b

比较两个排序列表,并删除相同的行 通信删除大小和日期列(顺便说一下,删除 /tmp/b 中行首的制表符(而不是 /tmp/a 中的制表符)以及 2 个列间空格),然后删除重复的文件名独特。(由于重复的行是相邻的,因此不需要再次排序)。

comm -3 /tmp/a /tmp/b | awk '{$1="";$2="";print substr($0,3)}' | uniq >/tmp/c

/tmp/c 中的列表是所有新文件、大小或时间戳不同的文件或已被删除的文件。将每个文件传递给 wget 进行获取(仍在适当的目录中)。

while read file
do  rm -f "$file"
    wget -N --no-directories ..../"$file" # non recursive single file to .
done </tmp/c

您应该配置您的 wget 镜像以不再获取该目录。

如果您可以做到find ... -printf '%9s %T+ %p\n',您可以使用这种技术,从镜像目录的顶部开始,有效地自己进行镜像。

相关内容