Estoy desconcertado. Mi script de Python tiene dos partes. Es muy simple.
Parte 1: Crea una nueva carpeta basada en la fecha y la hora. Luego mueve todos los archivos a esa carpeta. Esto ocurre una vez al día controlado por launchd.
Parte-2: Borra los directorios con más de 10 días de antigüedad.
Lo que he encontrado con mi nuevo ordenador o sistema operativo (Ventura 13.0), cuando el script no está en la carpeta Descargas, la primera parte del código se ejecuta bien, pero la segunda parte falla (la parte que borra los directorios antiguos). Sin embargo, cuando pongo la segunda parte de mi script en la carpeta
Descargas, se ejecuta sin problemas (es decir, borrando los directorios antiguos).
Me pregunto si se trata de un problema de permisos de MacOS. Algo que me permite crear carpetas pero no borrarlas cuando mi script se ejecuta desde una carpeta externa (fuera de la carpeta Descargas). Si es así, cómo lo resuelvo.
Código completo:
from datetime import datetime, date
from time import sleep
import os, shutil, pathlib
path = "/Users/user/Downloads/" #get the path to target directory
#get all the files into a list.
names = [name for name in os.listdir(path) if os.path.isfile(os.path.join(path, name))]
#select regular files, i.e. ignore hidden files and python files
regfiles = [f for f in names if not f.startswith('.') and f in names if not f.endswith('.py')]
#Now, lets grab the file extension os that we can label our new director properly
extensions = []
for item in regfiles:
extensions.append(pathlib.Path(item).suffix)
uniqExtensions = set(extensions)
uniqExtensions =''.join(uniqExtensions)
#get time function to name new directory
now = datetime.now()
year = now.strftime("%Y")
month= now.strftime("%m")
day = now.strftime("%d")
time = now.strftime("%H%M%S")
dir_name =(str(year)+str(month)+str(day)+"."+str(time))
dir_name = path + dir_name + uniqExtensions
myFilesWithFullPath=[]
for item in regfiles:
myFilesWithFullPath.append(path+item)
os.mkdir(dir_name)
for f in myFilesWithFullPath:
shutil.move(f, dir_name)
# #remove empty directories by a system call
#os.system("find %s -type d -empty -delete"%(path))
#------------------------
today = date.today()
names = os.listdir(path)
for item in names:
if os.path.isdir(item):
if not item.startswith('.'):
dirdate = date.fromtimestamp(os.path.getmtime(item))
#print((today - dirdate).days)
if ((today - dirdate).days) > 10:
shutil.rmtree(item)
La parte del código sólo se ejecuta cuando el script está en la carpeta Descargas:
#------------------------
today = date.today()
names = os.listdir(path)
for item in names:
if os.path.isdir(item):
if not item.startswith('.'):
dirdate = date.fromtimestamp(os.path.getmtime(item))
#print((today - dirdate).days)
if ((today - dirdate).days) > 10:
shutil.rmtree(item)
Actualización:
Así es como llamo al script de Python desde el archivo .plist. Y, cuando ejecuto mi Python script para las pruebas de Terminal que uso:
$ python3 organize-downloads-folder.py
para las pruebas.
</array>
<array>
<string>/Users/user-x/opt/miniconda3/bin/python</string>
<string>./Users/user-x/scripts/organize-downloads-folder.py</string>
</array>