Google api Google驱动器API:列出没有父级的文件

Google api Google驱动器API:列出没有父级的文件,google-api,google-drive-api,google-api-client,Google Api,Google Drive Api,Google Api Client,我管理的Google域中的文件已进入不良状态;根目录中有数千个文件。我想识别这些文件并将它们移动到“我的驱动器”下的文件夹中 当我使用API列出其中一个孤立文件的父级时,结果是一个空数组。为了确定某个文件是否为孤立文件,我可以遍历域中的所有文件,并请求每个文件的父文件列表。如果列表为空,我知道该文件是孤立的 但这是可怕的缓慢 是否仍然可以使用驱动器API搜索没有父级的文件 q参数的“parents”字段对此似乎没有用处,因为只能指定parents列表包含一些ID 更新: 我试图找到一种快速的方法

我管理的Google域中的文件已进入不良状态;根目录中有数千个文件。我想识别这些文件并将它们移动到“我的驱动器”下的文件夹中

当我使用API列出其中一个孤立文件的父级时,结果是一个空数组。为了确定某个文件是否为孤立文件,我可以遍历域中的所有文件,并请求每个文件的父文件列表。如果列表为空,我知道该文件是孤立的

但这是可怕的缓慢

是否仍然可以使用驱动器API搜索没有父级的文件

q参数的“parents”字段对此似乎没有用处,因为只能指定parents列表包含一些ID

更新:

我试图找到一种快速的方法来定位真正位于文档层次结构根的项。也就是说,他们是“我的驱动器”的兄弟姐妹,而不是“我的驱动器”的孩子

List<File> result = new ArrayList<File>();
Files.List request = drive.files().list();
request.setQ("'root'" + " in parents");

FileList files = null;
files = request.execute();

for (com.google.api.services.drive.model.File element : files.getItems()) {
    System.out.println(element.getTitle());
}
List result=new ArrayList();
Files.List请求=drive.Files().List();
setQ(“'root'”+“在父级中”);
FileList files=null;
files=request.execute();
for(com.google.api.services.drive.model.File元素:files.getItems()){
System.out.println(element.getTitle());
}

如果文件或文件夹位于根目录下,则“root”是父文件夹,但很简单,并且可以工作

    do {
        try {
            FileList files = request.execute();

            for (File f : files.getItems()) {
                if (f.getParents().size() == 0) {
                        System.out.println("Orphan found:\t" + f.getTitle());

                orphans.add(f);
                }
            }

            request.setPageToken(files.getNextPageToken());
        } catch (IOException e) {
            System.out.println("An error occurred: " + e);
            request.setPageToken(null);
        }
    } while (request.getPageToken() != null
            && request.getPageToken().length() > 0);

请尝试在查询中使用此选项:

'root' in parents 

建议使用以下查询:
是:无组织所有者:me

前提是:

  • 列出所有文件
  • 如果文件没有“parents”字段,则表示它是孤立文件
  • 因此,脚本将删除它们
开始之前,您需要:

  • 创建
  • 然后您需要将权限“../auth/drive”添加到OAuth id中,这样您就有了删除权限
准备好复制粘贴演示了

from\uuuuu future\uuuuu导入打印功能
进口泡菜
导入操作系统路径
从GoogleAppClient.discovery导入生成
从google_auth_oauthlib.flow导入安装的应用程序流
从google.auth.transport.requests导入请求
#如果修改这些作用域,请删除文件token.pickle。
作用域=['https://www.googleapis.com/auth/drive']
def回调(请求id、响应、异常):
如有例外:
打印(“异常:”,异常)
def main():
"""
说明:
显示了Drive v3 API删除孤立文件的基本用法。
"""
“---检查凭据--”
信誉=无
#文件token.pickle存储用户的访问和刷新令牌,并且
#在第一次完成授权流时自动创建
#时间。
如果os.path.exists('token.pickle'):
以open('token.pickle','rb')作为令牌:
creds=pickle.load(令牌)
#如果没有可用的(有效)凭据,请让用户登录。
如果没有信用或信用无效:
如果creds和creds.expired和creds.refresh\u令牌:
creds.refresh(请求())
其他:
flow=InstalledAppFlow.from_client_secrets_文件(
“credentials.json”,作用域)
creds=flow.运行本地服务器(端口=0)
#保存下一次运行的凭据
以open('token.pickle','wb')作为令牌:
pickle.dump(信用卡、代币)
“---打开连接--”
服务=构建('drive','v3',凭据=凭据)
page_token=“”
文件=无
孤儿=[]
页面大小=100
批处理计数器=0
打印(“列出孤立文件”)
打印(“-------------------------------”)
虽然(正确):
#名单
r=service.files().list(pageToken=page_token,
页面大小=页面大小,
fields=“nextPageToken,文件”
).execute()
page_token=r.get('nextpGetOken')
files=r.get('files',[])
#过滤孤儿
#注意:(如果文件没有“parents”字段,则表示它是孤立文件)
对于文件中的文件:
尝试:
如果文件['parents']:
打印(“找到父级的文件”)
例外情况除外,如e:
打印(“找到孤立文件”)
append(文件['id'])
#退出条件
如果page_标记为None:
打破
打印(“删除孤立文件”)
打印(“-------------------------------”)
批次大小=最小值(透镜(孤立),100)
而(len(孤儿)>0):
批处理=服务。新批处理\u http\u请求(回调=回调)
对于范围内的i(批次大小):
打印(“id为{0}的文件排队等待删除。”.format(孤儿[0]))
batch.add(service.files().delete(fileId=孤儿[0]))
del孤儿[0]
batch.execute()
批次计数器+=1
打印(“批处理{0}已删除-{1}文件已删除”。格式(批处理计数器,
批次(单位尺寸)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()

此方法不会删除根目录中的文件,因为它们具有字段“parents”的“root”值。如果没有列出所有的孤立文件,这意味着它们将被谷歌自动删除。这个过程可能需要24小时。

阿德里安·洛佩兹,谢谢你的脚本。这真的帮我省了很多体力活。以下是我实现脚本所遵循的步骤:

  • 创建了一个文件夹
    c:\temp\pythonscript\folder

  • 使用创建OAuth 2.0客户端ID,并将凭据文件下载到
    c:\temp\pythonscript\folder

  • 将上述
    client_secret_35;#######-#############.apps.googleusercontent.com.json
    重命名为
    credentials.json

  • 复制了Adrian Lopez的python脚本,并将其保存为
    c:\temp\pythonscript\deleteGoogleDriveOrpha