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

2024-05-06

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


使用鲁本的帮助,我使用了中建议的代码CryptoLocker - 使用 Google Apps 脚本恢复云端硬盘文件版本 https://stackoverflow.com/q/42402713/1595451(小改动 - 我的代码运行该文件夹中的所有文件,包括子文件夹)以删除病毒攻击当天创建的所有文件版本。现在每个文件的版本都是病毒攻击之前的版本。

/** 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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 制作 SQL Server 转储并将该转储导入另一个 SQL Server 的最佳(最简单)方法

    我想从一台服务器在 SQL Server 中实现数据库导出 转储 并将该转储导入到另一台 SQL Server 中 并且不一定使用相同的架构名称 例如 如果我准备了一个数据库 其中包含用于为新客户实施新数据库的所有数据集 则该数据库名为 D
  • 在 KRL 中如何获取当前的年、月、日?

    我正在开发一个应用程序 需要获取当前的年 月和日 有没有办法在规则的前块中获取此信息 我可以以字符串或数字或两者的形式获取此数据吗 目前有时间函数记录在http docs kynetx com docs Time http docs kyn
  • SSIS 脚本编辑器抛出异常

    我有 SQL Server 2012 SSIS SSDT 和 Visual Studio 2010 我可以创建一个新的 SSIS 包并添加脚本任务 但如果我尝试打开该脚本任务的脚本编辑器 则会收到以下错误 TITLE Microsoft V
  • 使用 simple_form 条目输入空数组值

    我对 Rails 和 simple form 仍然很陌生 并且一直在尝试实现多重选择选项来为用户提供多个角色 当前输入看起来像这样 所以 这确实有效 但在数组的开头包含一个空值 secondary
  • Android Studio 中的多个光标会自动出现在每个匹配的文本处吗?

    我一直在使用多个光标ALT SHIFT 有时我需要大约 20 个光标 并且希望它们位于文本同一部分的开头 每次都这样做很乏味 这有捷径吗 就像想象文件中有 20 个文本 foo 的实例 那么我只想选择一个 理想情况下它应该自动为同一位置的所
  • 我可以在反向传播期间(有选择地)反转 Theano 梯度吗?

    我热衷于利用最近论文中提出的架构 通过反向传播进行无监督域适应 http arxiv org pdf 1409 7495 pdf 在 Lasagne Theano 框架中 这篇论文的有点不同寻常之处在于它包含了一个 梯度反转层 invert
  • C# 字典值引用类型 - 请解释为什么会发生这种情况

    我不明白 C 中以下 linqpad 查询的结果 评论应该解释我困惑的地方 void Main Dictionary
  • 结构中字符串的管理

    我知道字符串的长度是可变的 因此它们需要内存中的可变空间来存储 当我们在 a 中定义一个字符串项时struct the struct的大小的长度将是可变的 较旧的语言通过使用固定长度的字符串来管理此问题 但是 C 中没有办法定义固定长度的字
  • 如果在 addSubView 之后调用,UIButton 不会移动

    所以我想移动一个UIButton单击后 The addMoreFields单击按钮后调用该方法 addMoreFieldBtn是一个全球性的UIButton 当我点击它时什么也没有发生 奇怪的是 如果我注释掉addSubView代码然后按钮
  • 如何使用jquery通过ajax发送电子邮件地址

    var emailid email protected cdn cgi l email protection var data email emailid ajax type POST url sample php data data da
  • 尝试修复此错误:找不到映射的图像 UIPickerViewFrameLeft-162-Popover.png

    我正在尝试以编程方式创建 uiPickerView 并将其添加到视图中 而不使用界面生成器 不要误会我的意思 我喜欢 IB 但我想这样做的原因是因为我正在尝试构建一个对象 我可以快速插入该对象以使用 UIPopoverViewControl
  • chrome_options.binary_location() TypeError: 'str' 对象不可调用

    我希望每个人都好 我是 python 新手 我尝试运行这段代码 但我不明白问题是什么以及如何解决这个问题 我的代码是 from selenium import webdriver from time import sleep url raw
  • 用parsec解析递归数据

    import Data Attoparsec Text Lazy import Data Text Lazy Internal Text import Data Text Lazy pack data List a Nil Cons a L
  • 间接变量/参数引用(另一个属性/另一个变量中的名称)

    是否可以使用 XSL 访问名称存储在另一个变量 或参数 中的变量 或参数 如果没有 为什么 我是 xsl 的新手 来自其他语言 可以使用此功能 例如 bash ant 也许我在寻找这个问题的答案时就错了 但既然我在SO上没有找到它 我想应该
  • 使 div 更大并在悬停时向上动画更大的部分

    当用户将鼠标悬停在 div 上时 我试图将 div 向上设置动画 我可以对 div 进行动画处理 使其变大 但动画是向下发生的 我试图将 div 的底部保持在同一位置 并平滑地向上增加 div 的大小 请参阅 jsfiddle 这里 htt
  • Python - 重写 print()

    我正在使用 mod wsgi 想知道是否可以覆盖 print 命令 因为它没用 这样做是行不通的 print myPrintFunction 因为这是一个语法错误 Print 不是 Python 2 x 中的函数 因此这不能直接实现 但是
  • Javascript 设置输入字段的值

    因为虽然我无法设置 type text 的输入字段的值 以前 我总是使用这样的东西
  • 在heroku实例上安装PIL

    我创建了一个python flask托管在heroku上的应用程序 我很有趣PILpython 中的图像库 我无法安装PIL在heroku实例中 我尝试过以下几种方法 方法一 Added PIL 1 1 7 in requirements
  • 锁定 contenteditable="true" div 中的元素

    我有一个用于用户输入的 contenteditable div 当单击按钮时 它会显示替换某些单词的选项 首先 它删除所有 html 并创建可以替换单词的 span 元素 这些词的标记不同 我面临一些问题 当直接在跨度之前或之后单击并键入文
  • 将 Google Drive 目录中的所有文件恢复为旧版本

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