使用Dropbox Web界面删除包含30,000个文件的文件夹

时间:2011-11-22 22:38:12

标签: dropbox dropbox-api

我的Dropbox中有一个包含30,000个文件的文件夹,我无法使用网络界面删除。看来我必须下载所有30,000个文件才能告诉dropbox我真的不想要它们。

出现此错误是因为最初拥有这些文件的计算机已经消失,我正在使用选择性同步来避免将30,000个文件下载到我的所有其他计算机。

有人能想出一个聪明的方法来解决这个问题吗?只是查看文件夹通常会导致Web界面崩溃。

2 个答案:

答案 0 :(得分:8)

删除文件夹中30,000多个文件的唯一方法是使用选择性同步下载它们。 Web界面将提供“太多文件请使用桌面应用程序”错误。它是自动化的,因此唯一需要的是时间(以及足够的硬盘空间)。如果没有足够的空间,请插入外部驱动器并在那里重新指定Dropbox目录,让它下载,然后删除。

这是一个愚蠢的问题,我知道。我希望您可以通过Web界面管理更多,因为这是您的文件的中心位置。

答案 1 :(得分:1)

我知道这有点迟了,但是对于其他任何偶然遇到这个问题且有同样问题的人......我的问题特别是我有数百个不再需要的文件只在Dropbox服务器和我不想清除硬盘只是为了能够通过选择性同步删除它们。

仍然无法从网络界面删除那么多文件,但是如果你不介意潜入Dropbox API这至少可以自动化,你不必使用自己的存储(我在下面使用Python SDK执行了此操作,但还有其他语言选项)。文件限制仍然适用,但可以计算每个目录中的文件数,以确定删除它们的正确方法,而不会遇到问题。像这样:

以下脚本将您的唯一Dropbox API密钥和Dropbox目录列表(deleteDirList)作为输入。然后循环遍历deleteDirList的每个元素的每个子目录,以确定是否有足够的文件能够删除目录而不达到限制(我将限制设置为保守的(?)10,000个文件);如果文件太多,则会单独删除文件,直到计数低于限制。您需要安装Python包dropbox(我使用Anaconda,所以conda install dropbox

请记住,这是一种蛮力的方法;每个子目录都会逐个删除,这可能需要很长时间。一个更好的方法是计算每个子目录中的文件,然后确定可以在不达到限制的情况下删除的最高级别目录,但遗憾的是我现在没有时间实现它。

import dropbox




##### USER INPUT #####

appToken = r'DROPBOX APIv2 TOKEN'
deleteDirList = ['/directoryToDelete1/','/directoryToDelete2/']      # list of Dropbox paths in UNIX format (where Dropbox root is specified as '/') within which all contents will be deleted. The script will go through these one at a time. These need to be separate directories; subdirectories will deleted in the loop and will throw an exception if listed here.

######################




dbx = dropbox.Dropbox(appToken)
modifyLimit = 10000

# Loop through each path in deleteDirList
for deleteStartDir in deleteDirList:
    deleteStartDir = deleteStartDir.lower()

    # Initialize pathList. This is the variable that records all directories down each path tree so that each directory is traversed, files counted, then deleted
    pathList = [deleteStartDir]

    # Deletion loop
    try:
        while 1:

            # Determine if there is a subdirectory in the current directory. If not, set nextDir=False
            nextDir = next((x.path_lower for x in dbx.files_list_folder(pathList[-1]).entries if isinstance(x,dropbox.files.FolderMetadata)),False)

            if not not nextDir:     # if nextDir has a value, append the subdirectory to pathList
                pathList.append(nextDir)
            else:       # otherwise, delete the current directory
                if len(pathList)<=1:        # if this is the root deletion directory (specified in deleteDirList), delete all files and keep folder
                    fileList = [x.path_lower for x in dbx.files_list_folder(pathList[-1]).entries]
                    print('Cannot delete start directory; removing final',len(fileList),'file(s)')
                    for filepath in fileList:
                        dbx.files_delete(filepath)

                    raise EOFError()    # deletion script is complete

                # Count the number of files. If fileCnt>=modifyLimit, remove files until fileCnt<modifyLimit, then delete the remainder of the directory
                fileCnt = len(dbx.files_list_folder(pathList[-1]).entries)
                if fileCnt<modifyLimit:
                    print('Deleting "{path}" and'.format(path=pathList[-1]),fileCnt,'file(s) within\n')
                else:
                    print('Too many files to delete directory. Deleting',fileCnt-(modifyLimit+1),'file(s) to reduce count, then removing',pathList[-1],'\n')
                    fileList = [x.path_lower for x in dbx.files_list_folder(pathList[-1]).entries]
                    for filepath in fileList[-modifyLimit:]:
                        dbx.files_delete(filepath)

                dbx.files_delete(pathList[-1])
                del pathList[-1]

    except EOFError:
        print('Deleted all relevant files and directories from "{}"'.format(deleteStartDir))