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!