Suppression de fichiers dans l’IFS
lun 24 juin 2019Cet article est très largement inspiré de l’article suivant :
Use Qshell Tools to Clean Up Your IFS Automatically.
La procédure va utiliser QSHELL pour effacer un ou plusieurs fichiers de l’IFS.
La procédure reçoit plusieurs paramètres qui vont permettre de construire la commande Unix : find ‑exe rm.
Commande find ‑exe rm
Find recherche des fichiers selon des critères.
-exe exécute une commande sur les fichiers trouvés par find.
Et rm est la commande de suppression.
La commande complète dit au système « efface les fichiers répondants aux critères fournis.»
Paramètres d’entrée
Les paramètres d’entrée sont les suivants :
- p_chemin contient le chemin où se trouve le ou les fichiers,
- p_jours contient le nombre de jours entre une date caractérisant le fichiers et la date du jour,
- p_Recursivite contient un booléen qui demande à rechercher dans les sous-dossiers s’il est à « VRAI »,
- p_Filtre contient une chaîne de caractère qui indique à la commande find de rechercher les fichiers qui contiennent cette chaîne,
- p_Type_date contient le type de date qui doit être comparée à p_jours :
- M=-mtime date de dernière modification,
- C=-ctime date de création,
- A=-atime date de dernier accès.
- p_jours est le nombre de jours utilisés pour comparer la date d’exécution du find moins p_jours (en jours évidemment) avec une des dates du fichier.
// Définition de l'Interface de la procédure
// Paramètres d'appel
// Procedure-Interface definition
// --------------------------------------------------
// Procedure name: Suppression_ifs
// Purpose: Supprimer un fichier ou un répertoire de l'ifs
// de façon récursive ou non
// Returns:
// Parameter: p_chemin => Contient le chemin de l'objet à supprim...
// er dans l'ifs
// p_Jours => Nombre de jours
// p_Recursivite => Récursif ou non
// p_Filtre => Filtre
// p_Type_date => date à comparer par rapport à p_Jours
// --------------------------------------------------
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;
Sécurité
Par souci de sécurité, on ne peut accéder qu’à /home afin d’éviter toute suppression de fichiers systèmes dans d’autres répertoires sensibles.
//---------------------------------------------------------
// 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;
Gestion de l’alimentation des paramètres d’entrée
Le début du traitement est de vérifier quels sont les paramètres qui sont passés et de gérer les paramètres null.
//----------------------------------------------------------
// 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;
Initialisation de la commande Unix
Initialisation de la commande find : le début de la commande Unix est constituée.
//-------------------------------------------------------------
// Départ de la construction de la chaîne de commande QSH
l_commande_qsh = 'STRQSH CMD(''find '
+ %trim(p_chemin)
+ ' -type f ';
Récursivité
Par défaut, la commande est non récursive si le paramètre correspondant est nul. L’option ‑prune empêche de descendre dans les sous-dossiers.
dcl-s l_Recursivite ind inz(*off);
| | |
| | |
if %parms > 2;
if %addr(p_Recursivite) <> *NULL;
l_Recursivite = p_Recursivite;
endif;
endif;
| | |
| | |
//-------------------------------------------------------------
// 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;
Filtre sur le nom
La commande accepte un paramètre pour filtrer sur le nom du fichier. Des jokers sont utilisables «*» pour remplacer plusieurs caractères et «?» pour remplacer 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;
Filtre sur les dates
La commande peut filtrer sur certaines dates caractérisant les fichiers.
Le paramètre M correspond à la date de dernière modification du fichier. Le nombre de jours transmis « x » indique de traiter les fichiers modifiés ces « x » derniers jours.
Le paramètre C correspond à la date de création du fichier. Le nombre de jours transmis « x’ indique de traiter les fichiers créés ces « x » derniers jours.
Le paramètre A correspond à la date du dernier accès du fichier. Le nombre de jours transmis « x’ indique de traiter les fichiers dont l’accès a eu lieu ces « x » derniers jours.
//-------------------------------------------------------------
// 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';
//-------------------------------------------------------------
// +/- 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'));
Finalisation de la commande Unix
La commande est complétée avec l’exécution de la commande de suppression. Et l’exécution de celle-ci avec l’API QCMDEXC.
//-------------------------------------------------------------
// -exec rm = Remove en QSH
l_commande_qsh = %trim(l_commande_qsh)
+ ' -exec rm {} \;'')';
//-------------------------------------------------------------
Cmd_exec(%trim(l_commande_qsh));
Ci-dessous, se trouve le source complet hébergé par Github.
https://github.com/ibmiiste/bazar/blob/master/QRPGLESRC/DLTIFS010R.SQLRPGLE