Использование веб-интерфейса Dropbox для удаления папки с 30 000 файлов - PullRequest
7 голосов
/ 23 ноября 2011

В моем дропбоксе есть папка с 30 000 файлов, которую я не могу удалить с помощью веб-интерфейса.Похоже, что мне нужно загрузить все 30 000 файлов, чтобы сообщить Dropbox, что я действительно не хочу их.

Эта ошибка возникла из-за того, что машина, на которой изначально были файлы, исчезла, и я использовал выборочную синхронизацию дляСтарайтесь не загружать 30 000 файлов на все мои другие компьютеры.

Может кто-нибудь придумать разумный способ обойти это?Просто просмотр папки обычно приводит к сбою веб-интерфейса.

Ответы [ 2 ]

8 голосов
/ 02 января 2015

Единственный способ удалить более 30 000 файлов в папке - это загрузить их с помощью выборочной синхронизации.Веб-интерфейс выдаст ошибку «Слишком много файлов, пожалуйста, используйте приложение для ПК».Он автоматизирован, поэтому требуется только время (и достаточно места на жестком диске).Если вам не хватает места, подключите внешний диск и переписайте туда каталог Dropbox, дайте ему скачать, а затем удалите.

Это глупая проблема, я знаю.Я хотел бы, чтобы вы могли больше управлять через веб-интерфейс, так как это центральное место для ваших файлов.

1 голос
/ 02 февраля 2018

Я знаю, что это (немного) поздно, но для тех, кто сталкивается с этим вопросом и имеет ту же проблему ... Моя проблема, в частности, в том, что у меня есть сотни гигов ненужных файлов только на Серверы Dropbox, и я не хочу очищать жесткий диск, чтобы иметь возможность удалять их с выборочной синхронизацией.

Удаление многих файлов по-прежнему невозможно из веб-интерфейса, но если вы не возражаете погрузиться в Dropbox API , это может быть, по крайней мере, автоматизировано, и вам не придется использовать свой собственное хранилище (я сделал это ниже с Python SDK , но есть и другие языковые опции). Ограничение на количество файлов все еще применяется, но количество файлов в каждом каталоге может быть подсчитано, чтобы определить правильный способ их удаления, не сталкиваясь с проблемой. Вот так:

Следующий скрипт принимает ваш уникальный ключ API Dropbox и список каталогов 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))
...