Saltar al contenido principal

Desmontar y Limpiar tu partición NTFS/exFAT desde macOS utilizando Python

Jose CerrejonAlrededor de 2 minApple

Desmontar y Limpiar tu partición NTFS/exFAT desde macOS utilizando Python

disco duro externo
Mi disco duro externo con toneladas de 💩.

A veces pienso que soy el único que tiene problemas con las particiones NTFS/exFAT en macOS. Tengo que desmontarla y limpiarla, porque exFAT es el sistema de archivos que uso en una Raspberry Pi que actúa como NAS utilizando el excelente DietPi OSopen in new window.


exFAT es uno de los sistemas de archivos compatibles con macOS, Windows y Linux. Simplemente usar Eject y expulsar el disco duro no es suficiente, así que tuve que crear un script en python que me ayudara con eso, y os lo muestro a continuación:

import subprocess
import os

def main():
    volumes = subprocess.run(['mount'], stdout=subprocess.PIPE).stdout.decode('utf-8').split('\n')

    for volume in volumes:
        if 'on /Volumes/' in volume and 'nodev' in volume:
            volume_name = volume.split()[2]
            clean_volume(f"{volume_name}/pelis" if os.path.isdir(f"{volume_name}/movies") else f"{volume_name}")

            subprocess.run(["diskutil", "unmountDisk", f"{volume_name}"])

def clean_volume(volume_name):
    print(f"\nFound: {volume_name}. Cleaning...")
    subprocess.run(["rm", "-rf", f"{volume_name}/.Trashes {volume_name}/.fseventsd {volume_name}/.Spotlight-V100"])
    subprocess.run(["find", volume_name, "-type", "f", "-name", "._*", "-depth", "-delete"])
    subprocess.run(["find", volume_name, "-type", "f", "-name", ".DS*", "-depth", "-delete"])


if __name__ == "__main__":
    main()

El código es bastante simple. Utiliza el módulo subprocess para ejecutar comandos de terminal y el módulo os para verificar si existe un directorio. Os muestro a continuación lo que hace cada parte del código:

  • subprocess.run(['mount'], stdout=subprocess.PIPE).stdout.decode('utf-8').split('\n'): Este comando ejecuta el comando mount en el terminal, que almacena en una variable todos los volúmenes montados en el sistema. El resultado se decodifica a una cadena y se divide en líneas.

  • if 'on /Volumes/' in volume and 'nodev' in volume: Este condicional verifica si la línea actual del comando mount es un volumen en /Volumes y si es un volumen nodev, que es un tipo de volumen que no está asociado a ningún dispositivo.

  • clean_volume(f"{volume_name}/pelis" if os.path.isdir(f"{volume_name}/movies") else f"{volume_name}"): Esta línea llama a la función clean_volume. Si el volumen tiene un directorio llamado movies, se limpia ese directorio. Si no, se limpia el volumen completo. Lo hago así para que no recorra todo el volumen, ya que tengo muchos archivos y carpetas en esa unidad.

  • subprocess.run(["diskutil", "unmountDisk", f"{volume_name}"]): Este es el comando desmonta el volumen del sistema.

La función clean_volume ejecuta varios comandos para limpiar el volumen:

  • subprocess.run(["rm", "-rf", f"{volume_name}/.Trashes {volume_name}/.fseventsd {volume_name}/.Spotlight-V100"]): Este comando elimina varios directorios que macOS utiliza para almacenar archivos de sistema y de caché.

  • subprocess.run(["find", volume_name, "-type", "f", "-name", "._*", "-depth", "-delete"]): Este comando busca y elimina todos los archivos que comienzan con ._, creados por macOS para almacenar metadatos de archivos en sistemas de archivos que lo no soportan.

  • subprocess.run(["find", volume_name, "-type", "f", "-name", ".DS*", "-depth", "-delete"]): Este comando busca y elimina todos los archivos que comienzan con .DS, que es mas o menos lo mismo que lo anterior.

¡Espero que os sirva!