「ファイルリストの構築...」がメモリ内で発生するのか、それともどこかに保存されるのかを尋ねました。rsync のソース、つまり を見てみましょうflist.c
。
2089 rprintf(FLOG, "building file list\n");
2090 if (show_filelist_p())
2091 start_filelist_progress("building file list");
2092 else if (inc_recurse && INFO_GTE(FLIST, 1) && !am_server)
2093 rprintf(FCLIENT, "sending incremental file list\n");
2094
2095 start_write = stats.total_written;
2096 gettimeofday(&start_tv, NULL);
2097
2098 if (relative_paths && protocol_version >= 30)
2099 implied_dirs = 1; /* We send flagged implied dirs */
2100
2101 #ifdef SUPPORT_HARD_LINKS
2102 if (preserve_hard_links && protocol_version >= 30 && !cur_flist)
2103 init_hard_links();
2104 #endif
2105
2106 flist = cur_flist = flist_new(0, "send_file_list");
2107 if (inc_recurse) {
2108 dir_flist = flist_new(FLIST_TEMP, "send_file_list");
2109 flags |= FLAG_DIVERT_DIRS;
2110 } else
2111 dir_flist = cur_flist;
flist_new
何もせずに、新しいファイル リスト プールを割り当てるだけです。文字列パラメーターは、メモリ不足エラーについて通知するためにあります。
次に、ファイル リストを送信するための行が数百行あります。rprintf
エラーメッセージの可能性を除いて、呼び出しは一切ありません。そのループで最も興味深い関数呼び出しは への呼び出しsend_file_name
ですが、これらも呼び出しrprintf
ません。
そうです、それはファイルをメモリに構築し、自分でソースにパッチを適用しないとログに記録できません。さらに、rsync のすべてがログ ファイルに記録されるわけではなく、一部のメッセージは画面に直接出力されます。実際、進行状況の設定によっては、単純なシェル リダイレクトを使用した方がよい場合もあります。(またはtee
、出力をファイルと標準出力に同時に出力するために使用します。)