7

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

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

谁能想到一个聪明的方法来解决这个问题?仅查看文件夹通常会导致 Web 界面崩溃。

4

2 回答 2

8

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

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

于 2015-01-02T16:02:37.473 回答
2

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

仍然无法从 Web 界面删除这么多文件,但如果您不介意深入研究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))
于 2018-02-01T21:30:27.590 回答