删除旧文件

时间:2017-09-01 09:19:18

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

我需要帮助创建一个Google Drive脚本,该脚本会自动删除除最近24个文件以外的所有旧文件。

我的网络驱动器每小时发送一个名为:

的7z数据库文件
DATABASENAME_01.09.2017_07.bak.7z

一般格式为:

DATABASENAME_DD.MM.RRRR_HH.bak.7z

Google云端硬盘上的文件会直接复制(我没有任何文件夹)。 我希望删除文件而不是移动到垃圾箱。这是关于释放空间。

我想使用Stackoverflow上描述的other solutions,但它们不符合我的要求。

据我所知,该脚本不起作用,因为它使用旧的Doclists函数。不幸的是,我不知道script.google中使用的编程语言

1 个答案:

答案 0 :(得分:2)

我认为最好的方法是使用DriveApp api。

您应该使用一些功能:

  • getFiles允许您选择所有驱动器文件
  • 您收到的FileIterator必须根据getDateCreated()
  • 进行排序
  • 使用removeFile api删除最旧的文件或将最旧的文件设置为使用setTrashed api删除。您可以使用Drive.Files.emptyTrash()清空垃圾箱(这是在高级Api中)。我们将看到此方法实际上并未完全删除文件,并且会导致意外结果。
  • 工作方法:有必要通过advanced API Drive.Files(请仔细阅读如何在脚本中启用高级API)。这样可以为您要删除的文件(已经为我们组织它们的查询)创建更快的查询。

这或多或少是我要解决你的问题:

// Get all the files
files_iterator = DriveApp.getFilesByType("application/7z-compressed");

var file_list = [];
while (files_iterator.hasNext()) {
  var fl = files_iterator.next();
  file_list.push(fl); 
}

// Sort the files on date created
file_list = file_list.sort(function(fl1, fl2) {
  return fl1.getDateCreated() < fl2.getDateCreated();
});

// Removing uneeded file
while (file_list.length > 24) {
  var fl = file_list.pop();
  DriveApp.removeFile(fl);
}

此代码未经过测试,可能包含错误。使用它需要您自担风险。

如果Mime Type不起作用,另一个解决方案是列出云端硬盘中的所有文件,并仅保留文件名以DATABASENAME开头的文件:

var files_iterator = DriveApp.getFiles();

var file_list = [];
while (files_iterator.hasNext()) {
  var fl = files_iterator.next();
  if (fl.getName().match("DATABASENAME"))
    file_list.push(fl); 
}

更稳定的版本

我写了一个似乎正常工作的新版本:

function myFunction() {
  // Query drive for the files that has name containing "DATABASENAME" as prefix
  // the result (items) is ordered by creating date
  var files = Drive.Files.list({
    q: 'title contains "DATABASENAME"', 
    orderBy: 'createdDate'
  }).items;
  // While keeping the last 24 elements, runs a function
  // for each element of the Array
  files.slice(0, -25).forEach(function(file) {
    // Deletes the file (recognized with its ID)
    Drive.Files.remove(file.id)
  });
}

如果您未启用高级API ,则此功能无效。我已经多次测试,只剩下最后24个元素。您必须等待该函数在再次运行之前结束其执行,或者数组可能变得不一致,第二次执行可能会删除不需要的文件。根据您的云端硬盘帐户中的文件数量,list功能(作为getFiles功能)会执行计数限制的查询。这项操作非常昂贵,每小时运行一次可能会超出配额。我建议你每天运行一次这个功能

关于list的一个好处是它实际上允许您通过7z mimeType("application/x-7z-compressed")的字符串进行搜索:

Drive.Files.list({
  q: 'mimeType = "application/x-7z-compressed"'
});

已弃用DriveApp

的第一版

这是我在AppScript和我的云端硬盘上实际测试的版本:

function myFunction() {
  var file_iterator = DriveApp.getFiles();

  var file_list = [];
  while (file_iterator.hasNext()) {
    var fl = file_iterator.next();
    if (fl.getName().match("DATABASENAMES"))
      file_list.push(fl); 
  }

  // Sort the files on date created
  file_list = file_list.sort(function(fl1, fl2) {
    return fl1.getDateCreated() < fl2.getDateCreated();
  });

  // Removing uneeded file
  while (file_list.length > 24) {
    var fl = file_list.pop();
    // fl.setTrashed(true); // if you want it in the trash
                            // instead of fully removed.
    DriveApp.removeFile(fl);
  }
}

但此版本的问题是实际上并未从驱动器中删除文件。我不明白为什么这个功能实际存在,我没有看到它的用法。它只会从视图

中删除文件
相关问题