2011-11-22 11 views
7

Tengo una carpeta en mi Dropbox con 30,000 archivos, que no puedo eliminar usando la interfaz web. Parece que tengo que descargar todos los 30,000 archivos para decirle a Dropbox que realmente no los quiero.Uso de la interfaz web de Dropbox para eliminar una carpeta con 30,000 archivos

Este error surgió porque la máquina que originalmente tenía los archivos se ha ido, y estaba usando la sincronización selectiva para evitar la descarga de 30,000 archivos en todas mis otras computadoras.

¿Alguien puede pensar en una forma inteligente de solucionar este problema? La simple visualización de la carpeta generalmente hace que la interfaz web se bloquee.

+0

¿Cuál es el tamaño total de los 30,000 archivos? – Flukey

+0

@Flukey: quizás 500mb a 1GB. Son bastante pequeños – Zach

+0

Lo resolví absorbiéndolo y esperando 12 horas para que todos los archivos se descargaran a otra máquina. Luego los borré, y las cosas son color de rosa ahora. – Zach

Respuesta

8

La única forma de eliminar más de 30,000 archivos en una carpeta es descargarlos mediante sincronización selectiva. La interfaz web mostrará el error "Demasiados archivos, utilice la aplicación de escritorio". Es automático, por lo que lo único que se necesita es tiempo (y suficiente espacio en el disco duro). Si no tiene suficiente espacio, conecte una unidad externa y vuelva a marcar el directorio de Dropbox, déjelo descargar y luego elimínelo.

Esto es un problema estúpido, lo sé. Me gustaría poder administrar más a través de la interfaz web, ya que esta es la ubicación central para sus archivos.

+1

¡No podía creer que sea 2015! Todavía grandes productos carecen de características menos obvias pero básicas. – nehemiah

+0

@itsneo Es 2015 y las 'características' aún deben programarse una por una en cada aplicación que escribimos. En algún lugar, falta un paso importante en la evolución de la programación. Solo mis dos centavos. – masterxilo

+0

Triste, como señaló Jason "La interfaz web es la ubicación central para todos los archivos", para lo cual Dropbox debería poner más dinero y talento.Pero sé que cuando DB comenzó, la opinión era diferente, pero ocurrió con el tiempo y el crecimiento de este popular producto. – nehemiah

1

Sé que esto es (un poco) tarde, pero para cualquier persona que tropieza con esta pregunta y tiene el mismo problema ... Mi problema específicamente es que tengo cientos de conciertos de archivos que ya no se necesitan solo en los servidores de Dropbox y no quiero limpiar un HDD solo para poder eliminarlos con sincronización selectiva.

Eliminando que muchos archivos aún no es posible desde la interfaz web, pero si no te importa bucear en el Dropbox API esto puede al menos ser automatizado y no tendrás que usar tu propio almacenamiento (lo hice a continuación con el Python SDK, pero hay otras opciones de idioma). El límite de archivos aún se aplica, pero la cantidad de archivos en cada directorio se puede contar para determinar la forma correcta de eliminarlos sin tener que lidiar con el problema. De la misma manera:

La siguiente secuencia de comandos toma su clave única de API de Dropbox y una lista de directorios de Dropbox (deleteDirList) como entradas. A continuación, recorre cada subdirectorio de cada elemento de deleteDirList para determinar si hay pocos archivos suficientes para poder eliminar el directorio sin alcanzar el límite (establezco el límite en un conservador (?) 10.000 archivos); si hay demasiados archivos, borra los archivos individualmente hasta que el conteo se encuentre por debajo del límite. Necesitarás instalar el paquete de Python dropbox (uso Anaconda, entonces conda install dropbox)

Ten en cuenta que este es un enfoque de fuerza bruta; cada subdirectorio se borra uno por uno, lo que puede llevar mucho tiempo. Un método mejor sería contar los archivos en cada subdirectorio y luego determinar el directorio de más alto nivel que se puede eliminar sin llegar al límite, pero desafortunadamente no tengo tiempo para implementarlo en este momento.

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)) 
Cuestiones relacionadas