lftpユーティリティには、mirror
ローカルディレクトリをリモートサーバーのディレクトリと同期させるコマンドがあります。コマンドは転送するファイルをどのように決定しますか?
特に、ファイルがローカルディレクトリとリモートディレクトリの両方にすでに存在する場合は、ターゲットディレクトリのファイルを上書きする必要があるかどうかをどのように判断しますか?修正時間だけに基づいていますか?それとも、より複雑な経験的方法を使用しますか?
ベストアンサー1
本当に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ホストはチェックサムハッシュを含むテキストファイルを提供するので、ダウンロードした内容を確認できます。運が悪く、完全に再ダウンロードする必要がありました。