Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

255
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!