将 Google Drive 目录中的所有文件恢复为旧版本

问题描述 投票:0回答:4

病毒最近加密了我的所有文件,不幸的是,谷歌备份和同步立即将文件的新版本(加密)上传到我的驱动器。 我知道我可以将单个文件恢复到以前的版本,但我的驱动器上大约有 30,000 个文件 - 这意味着我无法手动恢复所有这些文件... 我尝试使用 Apps 脚本,但我找不到真正解决它的方法。

google-apps-script google-drive-api
4个回答
2
投票

在 Ruben 的帮助下,我使用了 CryptoLocker - 使用 Google Apps 脚本恢复云端硬盘文件版本 中建议的代码(细微更改 - 我的代码运行文件夹中的所有文件,包括子文件夹)来删除我创建的文件的所有版本在病毒袭击的当天。现在每个文件的版本都是病毒攻击之前的版本。

/** A function that delete all version of files in folder and subfolders that were made at the day of the virus attack and afterwards*/
function fixAllFilesInFolder(){ 
  var sh = SpreadsheetApp.getActiveSheet();
  var folderId = #enter folder Id here
  var folder = DriveApp.getFolderById(folderId); // I change the folder ID  here 
  handleFolder(folder, 0)   
}

/** A recursive function - delete all 'bad' versions of files in folder and calls itself with each of the subfolders to do the same*/
function handleFolder(folder, treeRank){
  Logger.log(String(treeRank) + ': ' + folder.getName());
  fixFolderFiles(folder)
  var subFolders = folder.getFolders(); 
  while (subFolders.hasNext()){
    subFolder = subFolders.next();
    handleFolder(subFolder, treeRank + 1)
  }

}

/** Delete all 'bad' versions of files in folder*/
function fixFolderFiles(folder){
  var files = folder.getFiles(); 
  while (files.hasNext()){
    file = files.next();
    deleteRevisions(file)
  }
}

/** Delete 'bad' version of a file*/
function deleteRevisions(file){  
  var fileId = file.getId();  
  var revisions = Drive.Revisions.list(fileId);
  var virusDate = new Date(2021, 3, 30) /** Put your attack date here!*/
  if (revisions.items && revisions.items.length > 1) 
    {    
    for (var i = 0; i < revisions.items.length; i++) 
      {
        if (i > 0){
          var revision = revisions.items[i];      
          var date = new Date(revision.modifiedDate);
          if(date.getTime() > virusDate.getTime()){
            return Drive.Revisions.remove(fileId, revision.id); 
          }
        }       
      }  
    }
  
  }

两个注意事项:

  1. 不幸的是,Apps 脚本一次只能运行约 5 分钟,因此我必须从不同的文件夹运行代码多次(数十次)才能访问我的所有文件。
  2. 即使您将文件恢复到以前的版本,我的文件的名称仍然以加密格式“.wrui”结尾。为了解决这个问题,我下载了所有文件并运行了一个 python 脚本(可能可以在 Apps 脚本中完成,但我觉得使用 python 更舒服)来更改所有名称。
from os import rename, listdir, walk
from os.path import join, isfile

ENCRYPTION = 'wrui' #Here should be the encryption format

#A function to rename a file without the encryption format - it makes sure that no file is named with the same name exactly. In that case, it adds '2' to the files name
def renameFile(address, origin_name, new_name):
    final_name = new_name
    
    if isfile(join(address, new_name)):
        name_list = new_name.split('.')
        name_list[-2] += '2'
        final_name = '.'.join(name_list)
        
    rename(join(address, origin_name), join(address, final_name))

#A function to rename all files in a specific folder
def purifyFolderFiles(folder_address):
    for file in listdir(folder_address):
        f_list = file.split('.')
        if len(f_list) > 1:
            if f_list[-1] == ENCRYPTION:
                renameFile(folder_address, file, '.'.join(f_list[:-1]))
                
            elif f_list[-2] == ENCRYPTION:
                if f_list[-3] == f_list[-1]:
                    renameFile(folder_address, file, '.'.join(f_list[:-2]))                
                else:
                    del f_list[-2]
                    renameFile(folder_address, file, '.'.join(f_list))

#This next few lines iterate through all the subfolders of the specific folder you put and use purifyFolderFiles to rename every file there
folder = #enter you folder address here
for path, subdirs, files in walk(folder):
    for name in subdirs:
        subdir_address = join(path, name)
        purifyFolderFiles(subdir_address)

1
投票

添加此作为答案,因为我无法发表评论。

我在尝试接受的答案时学到了一些东西。

  1. 您输入新日期(年、月、日)的日期需要正确格式化。主要问题是月份值的范围是从 0(一月)到 11(十二月),而不是 1-12。
  2. 在您的编码区域中,您需要添加“Drive”服务。为此,请按库部分中的加号按钮,找到 Drive 服务并添加它。然后授予所需的权限。 enter image description here
  3. 文件夹 ID 是浏览器中的链接,而不是文件夹本身的名称。 enter image description here

这就是我需要做的一切才能让它发挥作用。 如果您希望程序告诉您正在更改哪些文件,请使用以下代码替换 deleteRevisions 函数:

/** Delete 'bad' version of a file*/
function deleteRevisions(file){  
  var fileId = file.getId();  
  var revisions = Drive.Revisions.list(fileId);
  var virusDate = new Date(2021, 09, 05) /** Put your attack date here! Year, Month (0-11), Day*/
  if (revisions.items && revisions.items.length > 1) 
    {
    Logger.log(file);    
    for (var i = 0; i < revisions.items.length; i++) 
      {
        if (i > 0){
          var revision = revisions.items[i];      
          var date = new Date(revision.modifiedDate);
          if(date.getTime() > virusDate.getTime()){
            return Drive.Revisions.remove(fileId, revision.id); 
          }
        }       
      }  
    }
  
  }

1
投票

我做了一些细微的更改,以修复原始文件名和修改时间,以便恢复文件保持感染前的状态。

/** Delete 'bad' version of a file*/
function deleteRevisions(file) {
  Logger.log(file);
  var fileId = file.getId();
  var revisions = Drive.Revisions.list(fileId);
  var virusDate = new Date("2022-08-03"); /** Date in "YYYY-MM-DD" format*/
  if (revisions.items && revisions.items.length > 1) {
    for (var i = 0; i < revisions.items.length; i++) {
      if (i > 0) { // rev[0] (v1) is original file version
        var revision = revisions.items[i];
        var revDate = new Date(revision.modifiedDate);
        if (revDate.getTime() > virusDate.getTime()) {
          Logger.log("Gonna delete " + file + " v." + i + "-" + revDate.toISOString());
          //return Drive.Revisions.remove(fileId, revision.id);
          Drive.Revisions.remove(fileId, revision.id);
          fixFileNameAndModifiedDate(file);

        }
      }
    }
  } else {

    fixFileNameAndModifiedDate(file);

  }
}


/** Fix 'correct' File Name & Last modified Date  */
function fixFileNameAndModifiedDate(file) {

  var fileId = file.getId();
  var revisions = Drive.Revisions.list(fileId);
  var lastFileVNr = revisions.items.length - 1; // Last File Version Number
  var lastFileVIt = revisions.items[lastFileVNr];  // Last File Version Item
  var lastFileVDt = new Date(lastFileVIt.modifiedDate); //Last File Version Date
  var lastFileVNm = lastFileVIt.originalFilename; //Last File Version Name
  var currFileMDt = file.getLastUpdated(); // Current File Modified Date
  var currFileMNm = file.getName(); // Current File Name .getName()

  // Different Modified Dates
  if (lastFileVDt.getTime() !== currFileMDt.getTime()) {

    Logger.log("Gonna change modif date: " + lastFileVDt.toISOString())

    Drive.Files.patch({ modifiedDate: lastFileVDt.toISOString() },
      fileId,
      { modifiedDateBehavior: "fromBody", supportsAllDrives: true });

  }

  // Different File Name
  if (lastFileVNm !== currFileMNm) {

    Logger.log("Gonna change file name: " + lastFileVNm)

    Drive.Files.patch({ title: lastFileVNm },
      fileId,
      { supportsAllDrives: true });

  }

  return

}


0
投票

这是另一个解决方案单击此处从github检查。 我的问题是所有文件都已加密,而 Google Drive 还保留了加密版本和以前的版本。我必须紧急转换一些文件,任何运行的脚本都会对恢复的文件产生问题。所以我检查了文档并与理解的人讨论。我什至搜索并询问了人工智能工具。有一次我想出了如何解决这个问题,并在 github 上分享给任何想要更新、使用甚至更改代码的人。

© www.soinside.com 2019 - 2024. All rights reserved.