lftp实用程序有一个mirror命令,它将本地目录与远程服务器上的目录同步。这个命令如何决定哪些文件需要传输?
特别是,如果一个文件已经存在于本地目录和远程目录中,它如何决定是否应该覆盖目标目录中的文件?它只是基于修改时间,还是使用了更复杂的启发式?
发布于 2021-07-01 17:20:23
在比较文件时,lftp不执行文件内容完整性检查(例如散列)。在确保下载文件的完整性时,这一点很重要。
在处理损坏的下载时,我首先怀疑了这一点,并注意到mirror命令完成得太快,无法执行哈希操作。然后我通过检查lftp源代码来确认。具体来说:FileInfo::SameAs方法处理这个问题(github上最新的src (粘贴在下面))。
bool FileInfo::SameAs(const FileInfo *fi,int ignore) const
{
if(defined&NAME && fi->defined&NAME)
if(strcmp(name,fi->name))
return false;
if(defined&TYPE && fi->defined&TYPE)
if(filetype!=fi->filetype)
return false;
if((defined&TYPE && filetype==DIRECTORY)
|| (fi->defined&TYPE && fi->filetype==DIRECTORY))
return false; // can't guarantee directory is the same (recursively)
if(defined&SYMLINK_DEF && fi->defined&SYMLINK_DEF)
return (strcmp(symlink,fi->symlink)==0);
if(defined&DATE && fi->defined&DATE && !(ignore&DATE))
{
time_t p=date.ts_prec;
if(p<fi->date.ts_prec)
p=fi->date.ts_prec;
if(!(ignore&IGNORE_DATE_IF_OLDER && date<fi->date)
&& labs(date-fi->date)>p)
return false;
}
if(defined&SIZE && fi->defined&SIZE && !(ignore&SIZE))
{
if(!(ignore&IGNORE_SIZE_IF_OLDER && defined&DATE && fi->defined&DATE
&& date<fi->date)
&& (size!=fi->size))
return false;
}
return true;
}仔细看一看,您可以看到lftp试图检查以下内容:
但是,即使是这些检查也不能完全信任,因为如果某些内容返回为未定义的,则简单地跳过这些检查。
如果幸运的话,FTP主机将提供一个带有校验和散列的文本文件,以便验证下载的内容。我没那么幸运,不得不完全重新下载。
发布于 2021-02-27 01:01:17
很可能是在检查文件大小和/或创建时间,以确定是否修改了该文件,除非您指定要复制哪些文件。
LFTP手册的一小部分:
--ignore-time ignore time when deciding whether to download
--ignore-size ignore size when deciding whether to download
--only-missing download only missing files
--only-existing download only files already existing at target
-n, --only-newer download only newer files (-c won't work)
--upload-older upload even files older than the target ones
--transfer-all transfer all files, even seemingly the same at the
target sitehttps://unix.stackexchange.com/questions/636649
复制相似问题