javascript AppScript问题-删除重复文件名

ef1yzkbh  于 2023-06-04  发布在  Java
关注(0)|答案(3)|浏览(127)

晚上好

我试图找出一种方法来自动删除文件名重复的文件从谷歌驱动器文件夹。我想保留创建日期最早的文件,将其他文件视为重复文件,并删除重复文件。

我觉得使用下面的AppScript代码(来自这个网站:https://hackernoon.com/how-to-find-and-delete-duplicate-files-in-google-drive)。唯一的问题是代码似乎保留了最新的文件,而不是最旧的文件。你知道我能做什么来改变这段代码,以保留最旧的文件而不是最新的文件吗?如果你有其他的代码来实现我的目标,也请分享。
谢谢你!

const FOLDER_ID = "INSERTIDHERE";

// Add id of the folder to check for duplicate

/*
 * Function looks for duplicate file names in designated folder and removes them.
 * @param {String} fileName
 */
function removeDuplicateFile() {
  let folder = DriveApp.getFolderById(FOLDER_ID);

  let files = folder.getFiles();

  let fileList = [];

  // if no file is found return null
  if (!files.hasNext()) {
    return;
  }

  // else
  while (files.hasNext()) {
    let file = files.next(),
      name = file.getName(),
      size = file.getSize();

    // checking this way always leaves first file not deleted
    if (isDuplicateFile(fileList, name, size)) {
      file.setTrashed(true);
    } else {
      fileList.push([name, size]);
    }
  }
}

/*
 * Function is helper function of removeDuplicateFile function.
 * It checks if theres already a file in the given lst with same name and size and returns true or false
 * @param {List} lst
 * @param {String} name
 * @param {Number} size
 * @returns {Boolean}
 */
function isDuplicateFile(lst, name, size) {
  for (let i = 0; i < lst.length; i++) {
    if (lst[i][0] === name && lst[i][1] === size) return true;
  }
  return false;
}

/*
 * Delete all the triggers if there are any
 */
var deleteTrigger = () => {
  let triggersCollection = ScriptApp.getProjectTriggers();
  if (triggersCollection.length <= 0) {
    console.log(`Event doesnot have trigger id`);
  } else {
    triggersCollection.forEach((trigger) => ScriptApp.deleteTrigger(trigger));
  }
  return;
};

/*
 * Create a trigger function for file which also deletes previous triggers if there are.
 */
function removeDuplicateFileTrigger() {
  // First Delete existing triggers
  deleteTrigger();

  // now remove duplicate files 
  removeDuplicateFile();
}
sg24os4d

sg24os4d1#

我相信你的目标如下。

  • 您希望删除重复的文件。在这种情况下,您希望保留最早的文件作为创建日期。

在您的脚本中,不包括用于检查创建日期的脚本。那么,在这种情况下,下面的修改怎么样?在该修改中,如下修改函数removeDuplicateFile()

修改脚本:

function removeDuplicateFile() {
  let folder = DriveApp.getFolderById(FOLDER_ID);
  let files = folder.getFiles();
  if (!files.hasNext()) {
    return;
  }
  
  // Retrieve files by parsing the filename and the file size.
  let list = {};
  while (files.hasNext()) {
    let file = files.next(),
      name = file.getName(),
      size = file.getSize(),
      date = file.getDateCreated().getTime();
    let key = name + size;
    list[key] = list[key] ? [...list[key], { file, size, date }] : [{ file, size, date }];
  }

  // Keep the oldest files.
  let removeFiles = Object.values(list).reduce((ar, v) => {
    if (v.length > 1) {
      let [, ...f] = v.sort((a, b) => a.date > b.date ? 1 : -1);
      ar = [...ar, ...f.map(({ file }) => file)];
    }
    return ar;
  }, []);

  // Remove files except for the oldest files.
  removeFiles.forEach(f => f.setTrashed(true));
}
  • 运行此脚本时,将通过检查文件名和文件大小来检索文件列表。并且,删除重复的文件,同时保留最早创建的文件。
  • 在此修改中,不使用您的isDuplicateFile

参考资料:

uklbhaso

uklbhaso2#

function removeDuplicateFile() {
  const folder = DriveApp.getFolderById("fid");
  const files = folder.getFiles();
  let fObj = { pA: [] };
  //collect all files with same names into an object of arrays 
  while (files.hasNext()) {
    let f = files.next();
    let n = f.getName();
    let dv = f.getDateCreated().valueOf();
    let id = f.getId();
    if (!fObj.hasOwnProperty(n)) {
      fObj[n] = [{ name: n, value: dv, id: id }];
      fObj.pA.push(n);
    } else {
      fObj[n].push({ name: n, value: dv, id: id });
    }
  }
  fObj.pA.forEach(p => {
    fObj[p].sort((a, b) => b.value - a.value);//sort descending by date created
    fObj[p].forEach((ob,i) => {
      if(i > 0) {
        Drive.Files.remove(ob.id);//deletes files  permanently
      }
    });
  });
}

您可能需要启用驱动器API

zf9nrax1

zf9nrax13#

保留最旧文件并删除Google云端硬盘中重复文件的替代方案

请注意开启驱动器API。

function keepOldestFilesOfEachNameInAFolder() {
  const folder = DriveApp.getFolderById("INSERT FOLDER ID");
  const files = folder.getFiles();
  let fO = { pA: [] };
  let keep = [];
  while (files.hasNext()) {
    let file = files.next();
    let n = file.getName();
    //Organize file info in fO
    if (!fO.hasOwnProperty(n)) {
      fO[n] = [];
      fO[n].push(file);
      fO.pA.push(n);
    } else {
      fO[n].push(file);
    }
  }
  //Sort each group with same name
  fO.pA.forEach(n => {
    fO[n].sort((a, b) => {
      let va = new Date(a.getDateCreated()).valueOf();
      let vb = new Date(b.getDateCreated()).valueOf();
      return va - vb; // I have modified this line to retain the oldest one instead of the newest files created
    });
    //Keep the oldest one and delete the rest
    fO[n].forEach((f, i) => {
      if (i > 0) {
        Drive.Files.remove(f.getId());
      }
    });
  });
}

相关问题