Supprimer des fichiers dans l’IFS sans se brûler les doigts
lun 24 juin 2019Contexte et principe
Cet article est inspiré de « Use Qshell Tools to Clean Up Your IFS Automatically » publié sur MC Press Online, qui montre comment encapsuler la commande Unix find dans une procédure RPG pour automatiser le nettoyage de l’IFS.
L’idée est de construire dynamiquement une commande find … -exec rm exécutée via QShell, en fonction de critères passés en paramètres (chemin, nombre de jours, récursivité, filtre de nom, type de date).
La commande find permet de rechercher des fichiers selon différents critères (nom, dates, type, etc.).
L’option -exec exécute une commande pour chaque fichier trouvé, et ici cette commande est rm, qui supprime le fichier correspondant.
En résumé, la commande complète dit au système : « supprime les fichiers qui correspondent aux critères fournis ».
Paramètres de la procédure
La procédure RPG Suppression_ifs encapsule cette logique et expose une interface générique :
Dcl-proc Suppression_ifs export;
dcl-pi Suppression_ifs ind;
p_chemin varchar(2000) const;
p_Jours Int(5) const;
P_Recursivite ind const options(*nopass:*omit);
p_Filtre varchar(128) const options(*nopass:*omit);
p_Type_date char(1) const options(*nopass:*omit);
end-pi;
Rôle de chaque paramètre :
p_chemin: chemin IFS où se trouvent les fichiers à traiter.p_Jours: nombre de jours utilisé pour le critère de date.p_Recursivite: indicateur qui, s’il est à VRAI, autorise la descente dans les sous‑répertoires.p_Filtre: modèle de nom de fichier (avec jokers*et?) transmis àfindvia-name.p_Type_date: type de date prise en compte pour la comparaison avecp_Jours:
p_Jours est interprété comme un décalage en jours entre la date du jour et la date caractéristique du fichier : la commande find compare donc « maintenant moins p_Jours » avec la date choisie, en utilisant un signe + ou - (strictement plus vieux que N jours, ou moins vieux que N jours).
Sécurité : limiter la zone de purge
Pour limiter les risques de suppression accidentelle d’objets système, la procédure intègre un garde‑fou simple : elle n’autorise que les chemins situés sous /home.
//---------------------------------------------------------
// Mécanisme optionnel de protection, autorisation uniquement
// dans le répertoire /home afin d'éviter de supprimer des
// objets systèmes
//---------------------------------------------------------
if (%subst(p_chemin:1:6) <> '/home/');
return *ON;
endif;C’est une protection volontairement stricte, pensée pour des répertoires applicatifs ou utilisateurs.
À adapter en fonction de votre organisation (par exemple /home, /data, /logs, etc.) et de votre politique de sécurité interne.
Gestion des paramètres optionnels
Le début du traitement consiste à vérifier quels paramètres ont réellement été passés et à gérer les paramètres omis, via *NOPASS / *OMIT.
//----------------------------------------------------------
// Initialisation des variables avec les paramètres si applicable
//----------------------------------------------------------
if %parms > 2;
if %addr(p_Recursivite) <> *NULL;
l_Recursivite = p_Recursivite;
endif;
endif;
if %parms > 3;
if %addr(p_Filtre) <> *NULL;
l_Filtre = %trim(p_Filtre);
endif;
endif;
if %parms > 4;
if %addr(p_Type_date) <> *NULL;
l_type_date = p_Type_date;
endif;
endif;
On travaille ainsi avec des variables locales (l_Recursivite, l_Filtre, l_type_date) initialisées par défaut, puis surchargées si les paramètres correspondants sont présents.
Construction progressive de la commande find
1. Initialisation
On commence par construire le début de la commande QShell :
//-------------------------------------------------------------
// Départ de la construction de la chaîne de commande QSH
l_commande_qsh = 'STRQSH CMD(''find '
+ %trim(p_chemin)
+ ' -type f ';On indique le répertoire de base et on limite la recherche aux fichiers (-type f).
2. Récursivité
Par défaut, la commande est non récursive si p_Recursivite n’est pas fourni ou vaut OFF.
On utilise -prune pour empêcher find de descendre dans les sous‑répertoires.
dcl-s l_Recursivite ind inz(*off);
// ...
//-------------------------------------------------------------
// Voie sécurisée, par défaut non récursif
// -prune empêche de descendre dans les sous-répertoires
if not l_Recursivite;
l_commande_qsh = %trim(l_commande_qsh)
+ ' -path '''''
+ %trim(p_chemin)
+ '/*'''''
+ ' -prune';
endif;3. Filtre sur le nom
Si un filtre est fourni, on ajoute une clause -name à find.
Les jokers Unix classiques sont utilisables : * (plusieurs caractères) et ? (un caractère).
//-------------------------------------------------------------
// Plus sécurisé, on filtre sur un modèle de nom
if l_Filtre <> *BLANKS;
l_commande_qsh = %trim(l_commande_qsh)
+ ' -name '''''
+ %trim(l_Filtre)
+ '''''';
endif;Exemples de filtres possibles : *.pdf, *.log, REP_??.csv, etc.
4. Filtre sur les dates
La commande peut ensuite filtrer sur une des dates caractéristiques du fichier.
//-------------------------------------------------------------
// Time: M, C or A = -mtime, -ctime, -atime
// M : Date de modification
// C : Date de création
// A : Date de dernier accès
l_type_date = %xlate('MCA':'mca':l_type_date);
l_commande_qsh = %trim(l_commande_qsh) + ' -'
+ l_type_date + 'time';On force la lettre en minuscule, puis on ajoute -mtime, -ctime ou -atime suivant le cas.
On gère ensuite le signe et la valeur associée au nombre de jours :
//-------------------------------------------------------------
// +/- Nombre de jours
if (l_Jours >= 0);
l_commande_qsh = %trim(l_commande_qsh) + ' +';
else;
l_commande_qsh = %trim(l_commande_qsh) + ' -';
endif;
l_commande_qsh = %trim(l_commande_qsh)
+ %trim(%editc(%abs(p_Jours):'J'));+Nsignifie « strictement plus de N jours ».-Nsignifie « strictement moins de N jours ».N(sans signe) signifie « exactement N jours ».
5. Finalisation et exécution
Enfin, on complète la commande avec l’exécution de rm et on appelle l’API QCMDEXC via une procédure Cmd_exec.
//-------------------------------------------------------------
// -exec rm = Remove en QSH
l_commande_qsh = %trim(l_commande_qsh)
+ ' -exec rm {} \\;'')';
//-------------------------------------------------------------
Cmd_exec(%trim(l_commande_qsh));Le couple -exec rm {} \; indique à find d’exécuter rm pour chaque fichier trouvé, en remplaçant {} par le chemin complet du fichier.
Recommandations d’usage
- Toujours commencer par tester la commande en mode « liste » plutôt qu’en mode « suppression » (par exemple en remplaçant
rmparlsouecho) pour vérifier le périmètre exact des fichiers ciblés. - Valider le comportement sur un environnement de test avant de déployer en production.
- Vérifier les droits d’accès IFS et la politique interne de purge, notamment sur les répertoires autorisés.

