La automatización del borrado de ficheros es una tarea necesaria cuando, por ejemplo, estamos generando en un proceso planificado ficheros fechados periódicamente. Hacer exhaustivamente esta tarea es complicado y no siempre la realizamos por esa razón (yo al menos). Esta macro da solución a esa necesidad, os animo a usarla.
Lo primero que hacemos es crear un stream de datos, df
, que recoge el resultado del comando ls
. El parámetro F marca los directorios con una barra «/» al final, de forma que podemos eliminarlos de la salida del ls
con un grep -v
.
Usando df
como entrada para nuestro paso data todo lo que queda es procesar las información que hemos generado con un scan
, que divide la cadena por los espacios. Finalmente solo nos queda montar la fecha de creación del fichero teniendo en cuenta lo siguiente: Linux devuelve la fecha en dos formatos distintos dependiendo de si hace menos de 6 meses que se ha generado el fichero o si hace más. Este es un ejemplo:

Finalmente, filtramos los registros que contienen los nombres de los ficheros que queremos eliminar: ficheros anteriores a 2020 y que no sean tablas SAS. Un call system
ejemcutará un comando rm
con cada registro resultante. Esta es la macro:
%macro borrado(ruta=,fecha_limite=);
x "cd &ruta";
filename df pipe "ls -lahF &ruta | grep -v /";
data _null_;
infile df;
input todo $300.;
format fecha date9. fichero $100.;
dia = scan(todo,7," ");
if index(scan(todo,8," "),":") then anyo=year(date());
else anyo=input(put(scan(todo,8," "),$5.),8.);
if compress(scan(todo,6," "))='Jan' then mes=1;
else if compress(scan(todo,6," "))='Feb' then mes=2;
else if compress(scan(todo,6," "))='Mar' then mes=3;
else if compress(scan(todo,6," "))='Apr' then mes=4;
else if compress(scan(todo,6," "))='May' then mes=5;
else if compress(scan(todo,6," "))='Jun' then mes=6;
else if compress(scan(todo,6," "))='Jul' then mes=7;
else if compress(scan(todo,6," "))='Aug' then mes=8;
else if compress(scan(todo,6," "))='Sep' then mes=9;
else if compress(scan(todo,6," "))='Oct' then mes=10;
else if compress(scan(todo,6," "))='Nov' then mes=11;
else if compress(scan(todo,6," "))='Dec' then mes=12;
fecha = mdy(mes,dia,anyo);
if fecha > date() then fecha=intnx('year',fecha,-1,'S');
fichero = compress(scan(todo,9," "),'*');
if fecha < &fecha_limite and not index(fichero,'.sas7bdat');
call system('rm '||fichero);
run;
%mend;
%borrado(ruta=[rute],fecha_limite='1jan2020'd);