如何以编程方式从 dropbox 下载许多大文件

问题描述

国家语音语料库是新加坡人英语口语的自然语言处理语料库,可在此处找到:https://www.imda.gov.sg/programme-listing/digital-services-lab/national-speech-corpus

当您注册免费语料库时,您会被定向到一个 DropBox 文件夹。语料库为 1 TB,(在撰写本文时)有四个部分。我只想下载第 1 部分,但即使这样也有 1446 个 zip 文件,每个文件都很大。我的问题是:如何仅使用命令行以编程方式将许多大文件从 DropBox 下载到 Linux (Ubunut 16.04) VM。

相关部分的目录树如下所示:

root
|-LEXICON
|-PART1
  |-DATA
    |-CHANNEL0
      |-WAVE
        |-SPEAKER0001.zip
        |-SPEAKER0002.zip
        ...
        |-SPEAKER1446.zip

我研究了几种不同的方法

  1. 使用共享链接通过 this question 中所述的 WAVE 命令下载 wget 父目录。但是,这并没有奏效,因为我收到了这个错误

    重用与 www.dropbox.com:443 的现有连接 HTTP 请求已发送,正在等待响应... 400 错误请求 2021-01-06 23:09:06 错误 400:错误请求。

我认为这是因为 WAVE 目录太大,DropBox 无法压缩。

  1. 基于 this post,有人建议我可以下载 WAVE 父目录的 HTML 并找到指向各个 zip 文件的所有直接链接,但可以找到指向个别文件不在 HTML 文件中。

  2. 基于与 (2) 中相同的帖子,我还可以尝试使用 dropBox API 为每个 zip 文件创建共享链接,尽管这看起来太麻烦了。

  3. 下载 Linux DropBox 客户端并按照 this installation 中所述同步相关文件

最后,第四个选项对我有用,但我想为将来需要下载此数据集的任何人发布此调查。另外,我想看看其他人是否有更好的方法

解决方法

正如我所描述的,对我有用的方法是使用 Dropbox 的 linux 客户端将文件同步到我的 Linux VM。您可以按照these instructions下载Linux客户端。这些说明在我的 Ubuntu 16.04 VM 上对我有用。

我在使用同步客户端时遇到的一个问题是如何有选择地排除目录。我的 VM 上只有 630 GB,整个 National Speech Corpus 大小为 1TB,因此我需要在 Dropbox 同步填满我的磁盘之前排除文件。

您可以使用安装页面底部的 dropbox python 脚本有选择地排除文件。脚本的链接是 here。使用以下命令从我的主目录(自动安装 Dropbox 同步文件夹)调用 python 脚本:

python dropbox.py exclude add ~/Dropbox/<path_to_excluded_dir>

您可能想要停止和启动 Dropbox 客户端,可以通过以下方式完成:

python dropbox.py start
python dropbox.py stop

最后,查看python脚本中的命令以获取更多信息:

python dropbox.py --help

通过这种方法,我能够轻松下载所需的文件,而不会让我的 VM 不堪重负。