【问题标题】:How to compress files in google drive?如何压缩谷歌驱动器中的文件?
【发布时间】:2025-12-08 08:35:02
【问题描述】:

有没有办法将大文件压缩成 .tar.gz 文件在谷歌驱动器中的较小 .zip?我尝试了 google appscript,但它创建了 .zip 文件但没有压缩。如何做到这一点?

【问题讨论】:

    标签: google-apps-script compression google-drive-api


    【解决方案1】:

    我发现有一种使用Google Colaboratory 将大文件压缩/解压缩到Google Drive 的高效、快速、简单但间接的方法。

    例如, 假设您的 Google Drive 中有一个名为 Dataset 的目录,大小为 5 GB,任务是将其压缩(压缩)为 Dataset.zip

    谷歌云端硬盘:

    我的云端硬盘

    数据集

    步骤:

    1. 打开Google Colab(免费),创建一个新笔记本
    2. 通过运行以下命令行将 Google 驱动器装载到 Google Colab 中:

      from google.colab import drive drive.mount('/content/gdrive')

      注意:现在在左侧(文件)中,您可以在 gdrive 中观察您的 My Drive 以及在 My 中的文件夹 Dataset开车

    压缩前的截图。

    Colab Drive Mount

    1. 通过以下命令运行更改当前目录。

      cd gdrive/My Drive/

    2. 压缩文件/文件夹:DatasetDataset.zip 使用以下命令运行。

      !zip -r Dataset.zip Dataset/

    压缩后的截图:

    Colab Drive Mount after zipping

    Google Drive Screenshot after zipping

    注意:以上命令的灵感来自于 ubuntu。因此,对于解压缩使用:

    !unzip filename.zip -d ./filename

    【讨论】:

    • 非常有用,谢谢!对我来说,以上只适用于 gzip(这很好)
    【解决方案2】:

    我已经使用 10MB 大小的驱动器中的 pdf 文件尝试并测试了以下代码,它确实将其压缩为 9MB。我什至测试了一个云端硬盘文件(幻灯片),它确实压缩了它。

    function fileZip(){
     var files = DriveApp.getFilesByName('Google_Apps_Script_Second_Edition.pdf');
      while (files.hasNext()) {
        var file = files.next();
     file = file.getBlob()}
    
    DriveApp.createFile(Utilities.zip([file], 'tutorialFiles.zip'));
    
    }
    

    希望有帮助!

    【讨论】:

    • 您的文件需要 6 MB 或 7 MB 的转换。这可能吗?
    • 取决于文件类型。我们使用一些专有文件,有时压缩后的文件比解压缩后的文件大。这完全取决于数据类型的紧凑程度以及它与特定压缩算法的匹配程度。不知道 GAS 使用哪种 zip 架构。
    【解决方案3】:

    实际上比这更容易。文件已经是 Blob(任何具有 getBlob() 的东西都可以传递给任何需要 Blob 的函数)。所以代码看起来像这样:

    var folder = DocsList.getFolder('path/to/folder');
    folder.createFile(Utilities.zip(folder.getFiles(), 'newFiles.zip'));
    

    此外,如果您在文件夹中有多个同名文件,它将不起作用...Google 云端硬盘文件夹支持,但 Zip 文件不支持。

    要使用多个具有相同名称的文件:

    var folder = DocsList.getFolder('path/to/folder');
    var names = {};
    folder.createFile(Utilities.zip(folder.getFiles().map(function(f){
      var n = f.getName();
      while (names[n]) { n = '_' + n }
      names[n] = true;
      return f.getBlob().setName(n);
    }), 'newFiles.zip'));
    

    (Source)

    【讨论】: