Я знаю, что это (немного) поздно, но для всех, кто натыкается на этот вопрос и имеет ту же проблему... Моя проблема в том, что у меня есть сотни гигабайт ненужных файлов только на серверах 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))
person
jshrimp29
schedule
01.02.2018