我到处寻找,但还是没能找到问题的答案。我不确定这是否是合适的论坛,但我希望这里有人能提供帮助。
我一直使用 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'
,您可以使用这种技术,从镜像目录的顶部开始,有效地自己进行镜像。