Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

257
Visualizações
Eliminar directorio y todos los enlaces simbólicos recursivamente

Traté de usar shutil para eliminar un directorio y todos los archivos contenidos, de la siguiente manera:

 import shutil from os.path import exists if exists(path_dir): shutil.rmtree(path_dir)

Desafortunadamente, mi solución no funciona y arroja el siguiente error:

 FileNotFoundError: [Errno 2] No such file or directory: '._image1.jpg'

Una búsqueda rápida mostró que no soy el único que tiene este problema. Según tengo entendido, la función rmtree es equivalente al comando de shell rm -Rf $DIR , pero este no parece ser el caso.

ps con fines de reconstrucción. Cree un enlace simbólico, por ejemplo, usando ln -s /path/to/original /path/to/link

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

De ¿Cómo eliminar un directorio que incluye todos sus archivos en python?

 # function that deletes all files and then folder import glob, os def del_folder(dir_name): dir_path = os.getcwd() + "\{}".format(dir_name) try: os.rmdir(dir_path) # remove the folder except: print("OSError") # couldn't remove the folder because we have files inside it finally: # now iterate through files in that folder and delete them one by one and delete the folder at the end try: for filepath in os.listdir(dir_path): os.remove(dir_path + "\{}".format(filepath)) os.rmdir(dir_path) print("folder is deleted") except: print("folder is not there")

También puede simplemente usar el indicador ignore_errors con shutil.rmtree() .

shutil.rmtree('/folder_name', ignore_errors=True) Eso debería eliminar un directorio con contenido de archivo.

over 4 years ago · Santiago Trujillo Relatório

0

Probablemente esté en Mac OSX y su directorio esté, al menos parcialmente, en un sistema de archivos que no sea de Mac (es decir, no sea HFS+). En esos, los controladores del sistema de archivos de Mac crean automáticamente archivos complementarios binarios con el prefijo ._ para registrar los llamados atributos extendidos (explicados en https://apple.stackexchange.com/questions/14980/why-are-dot-underscore-files-created -y-cómo-puedo-evitar-los , pero también se ilustra a continuación).

rmtree en sistemas que no admiten descriptores de archivos en os.scandir (como Mac OSX) ahora crea de manera insegura una lista de entradas y luego las desvincula una por una (creando una condición de carrera conocida: https://github.com/python/ cpython/blob/908fd691f96403a3c30d85c17dd74ed1f26a60fd/Lib/shutil.py#L592-L621 ). Desafortunadamente, dos comportamientos separados hacen que esta condición sea verdadera cada vez:

  1. el archivo original siempre aparece antes que el de atributos extendidos, y
  2. cuando el archivo original está desvinculado ( test.txt ), el metaarchivo ( ._test.txt ) se elimina simultáneamente.

Por lo tanto, el archivo de atributos extendidos faltará cuando sea su turno y arrojará el FileNotFoundError que está experimentando.

Creo que este error se solucionaría mejor con cpython#14064 , cuyo objetivo es ignorar FileNotFoundError s en rmtree en general.

Mitigación

Mientras tanto, puede ignorar los errores de desvinculación en esos metaarchivos con onerror :

 def ignore_extended_attributes(func, filename, exc_info): is_meta_file = os.path.basename(filename).startswith("._") if not (func is os.unlink and is_meta_file): raise shutil.rmtree(path_dir, onerror=ignore_extended_attributes)

Muestre el caso de los atributos extendidos de Mac

Para ilustrar, puede crear una pequeña imagen de disco ExFAT y montarla en /Volumes/Untitled con los comandos

 hdiutil create -size 5m -fs exfat test.dmg hdiutil attach test.dmg # mounts at /Volumes/Untitled cd /Volumes/Untitled mkdir test # create a directory to remove cd test touch test.txt open test.txt # open the test.txt file in the standard editor

Con solo abrir el archivo en el editor de texto estándar, se crea un archivo de atributos extendidos ._test.txt y se registra la última hora de acceso en él:

 /Volumes/Untitled/test $ ls -a . .. ._test.txt test.txt /Volumes/Untitled/test $ xattr test.txt com.apple.lastuseddate#PS

El problema es que al desvincular el archivo original también se desvincula automáticamente el archivo complementario.

 /Volumes/Untitled/test $ rm test.txt /Volumes/Untitled/test $ ls -a . ..
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda