J'ai l'impression que cela ne fonctionne pas avec la commande find
Code:find "$repRecherche" printf "%(+%Y-%m-%d %H:%M:%S)T\n -1" -type f \( -name "*.flag" -o -name "*.tar.gz" -o -name "*.zip" -o -name "*.txt" \) > "$log"
Version imprimable
J'ai l'impression que cela ne fonctionne pas avec la commande find
Code:find "$repRecherche" printf "%(+%Y-%m-%d %H:%M:%S)T\n -1" -type f \( -name "*.flag" -o -name "*.tar.gz" -o -name "*.zip" -o -name "*.txt" \) > "$log"
tu n'as pas lu le man find ! là, tu utilises l'horodatage de bash.
par exemple, pour avoir l'heure (uniquement), l'année du dernier accès et le nom des fichiers :à toi td'adapter à tes besoins.Code:find ./ -maxdepth 1 -type f -printf '%Ak %AY %p\n'
Alors voila j'ai trouvé cette merveilleuse commande en fouinant un peu. Le problème est que j'ai toujours ces résidus de secondes derrière que je n'arrive pas à supprimer pour ne garder que les secondes
Code:find "$repRecherche" -printf "%h/%f : dernier accès le %AA %Ad %AB %AY à %AH:%AM:%AS \n\n\n dernière modification le %TA %Td %TB à %TH:%TM:%TS\n" -type f \( -name "*.flag" -o -name "*.tar.gz" -o -name "*.zip" -o -name "*.txt" \) > "$log"
Ah ok je viens de trouver purée je suis dingue.
Code:find "$repRecherche" -printf "%h/%f : dernier accès le %AA %Ad %AB %AY à %AH:%AM:%.2AS \n\n\n dernière modification le %TA %Td %TB à %TH:%TM:%.2TS\n" -type f \( -name "*.flag" -o -name "*.tar.gz" -o -name "*.zip" -o -name "*.txt" \) > "$log"
Est ce que selon vous cela semble présentable comme analyse ? Y a til des infos en plus que je pourrai indiquer ? La je fais appel à votre degré de précision en analyse de logs qui pourraient être intéressantes à étudier.
c'est bien.
en fait, la pertinence des informations dépend de ce que tu veux faire.
par contre, si tu souhaites comparer les dates ou calculer le nombre de jours de présence des fichiers, le format le plus pratique est le nombre de secondes depuis Epoch (1er Janvier 1970).
En fait il faudrait que je calcule la différence entre la date ou a été déposé le fichier donc ici la dernière modification et la date du jour actuelle.
Mais comment rentrer cela à la suite de la commande -printf qui commence a devenir très longue
Alors j'ai trouvé ceci mais je suis confronté je pense à des problèmes de quote et autres trucs qui m'échappent
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 #!/bin/bash #Recherche et verification de la présence de fichiers sous l'arborescence SFTPUSERS repRecherche=/poche/guibs/sftpusers/ log=/poche/guibs/log/fichierlog`date +"_%d_%m_%Y_%Hh%mm"`.txt derniere_modification="%TA %Td %TB à %TH:%TM:%.2TS" diff=$(( ($(date '+%s' -d "$derniere_modification") - $(date '+%s')) / 86400 )) if test -n "$(find "$repRecherche" -maxdepth 0 -empty)"; then echo "Aucun fichier n'existe" exit 1 fi find "$repRecherche" -printf ""%h/%f : dernier accès le %AA %Ad %AB %AY à %AH:%AM:%.2AS \n\n\n dernière modification le "$derniere_modification" \n\n\n durée de présence du fichier "$diff"" -type f \( -name "*.flag" -o -name "*.tar.gz" -o -name "*.zip" -o -name "*.txt" \) > "$log"
En fait, sa question était "sais-tu comment...", donc une question demandant l'état de mes connaissances. Je lui ai répondu "non", donc en explicite "non je ne sais pas". De là tu ne peux pas venir dire "si si" sous-entendant "si si tu le sais et je sais mieux que toi ce que tu sais ou ne sais pas"...
Bon ok, c'était une vanne, j'ai évidemment pigé ce que tu veux dire :mrgreen:. Donc effectivement dans le cas présent tu peux le faire. Mais c'était "au cas où", pour lui montrer, dans un cadre plus général, comment traiter un flux de façon personnalisée. 8-)
Pour afficher des doubles quotes, soit
- tu utilises des quotes simples => -print 'dernier accès le "%h" ---'
- tu les protèges par un baclslash => -print "dernier accès le \"%h\" ---"
Ok donc j'ai placé les backslash mais il y a un mais
sur la ligne ci-dessous le message d'erreur m'affiche "fg: pas de contrôle de tâche"Code:find "$repRecherche" -printf "%h/%f : dernier accès le %AA %Ad %AB %AY à %AH:%AM:%.2AS \n dernière modification le \"$derniere_modification\" \n durée de présence du fichier \"$diff\" \n\n\n" -type f \( -name "*.flag" -o -name "*.tar.gz" -o -name "*.zip" -o -name "*.txt" \) > "$log"
Code:
1
2 derniere_modification="%TA %Td %TB à %TH:%TM:%.2TS"
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 #!/bin/bash #Recherche et verification de la présence de fichiers sous l'arborescence SFTPUSERS repRecherche=/poche/guibs/sftpusers/ log=/poche/guibs/log/fichierlog`date +"_%d_%m_%Y_%Hh%mm"`.txt derniere_modification="%TA %Td %TB à %TH:%TM:%.2TS" diff=$(( ($(date '+%s' -d "$derniere_modification") - $(date '+%s')) / 86400 )) if test -n "$(find "$repRecherche" -maxdepth 0 -empty)"; then echo "Aucun fichier n'existe" exit 1 fi find "$repRecherche" -printf ""%h/%f : dernier accès le %AA %Ad %AB %AY à %AH:%AM:%.2AS \n\n\n dernière modification le "$derniere_modification" \n\n\n durée de présence du fichier "$diff"" -type f \( -name "*.flag" -o -name "*.tar.gz" -o -name "*.zip" -o -name "*.txt" \) > "$log"
"%TA %Td %TB à %TH:%TM:%.2TS" ne veux rien dire pour date.
c'est un format pour le printf de find, ça ne peut pas être accepté comme paramètre de l'option -d de date.
la comparaison des dates ne peut pas se faire à la volée :
d'abord, renseigner le fichier "log" du jour
ensuite, comparer les données du "log" du jour avec celui de la précédente exécution du script.
tu as un problème d'algorithme : tu codes sans prévoir les articulations de ton script. c'est mal ! :)
Svear,
C'est une erreur de ma part mais ca ne resoud pas mon problème néanmoins
N_BaH,
Mais du coup je ne vois pas comment faire une différence pour trouver le nombre de jour de présence du fichier
A un moment donné, tu atteints les limites de ce que find peut t'offir. Tu ne t'imagines tout de même pas que ses concepteurs se sont amusés à passer en revue toutes les demandes les plus bizarres et farfelues qui pourraient naître dans les esprits les plus divers ; et ce d'autant plus que lesdits esprits ont à leur disposition le bash qui leur permet de récupérer et traiter par eux-mêmes les infos (les fichiers) retournés par la commande "find".
Donc si tu veux des actions très précises sur les fichiers que tu trouves, à toi de te programmer cette action comme je l'ai expliqué ici via la fonction "mise_au_propre". Et là, tu passes tes fichiers à ta fonction qui peut alors les traiter elle-même au travers d'autres outils disponibles dans Unix, tel par exemple "stat" (regarde le man)
Exemple qui affiche les fichiers et l'écart (en jours par rapport au moment où tu l'exécutes) de la dernière modif
Code:
1
2
3
4
5
6
7
8
9
10
11
12 #!/bin/bash traitement_perso() { today="$(date '+%s')" while read fic; do modif="$(stat --format "%Y" $fic)" ecart=$((($today - $modif) / 86400)) echo "$fic $modif $ecart" done } traitement_perso < <(find . -type f 2>/dev/null)
Merci Svear,
Mais je ne comprends pas comment inclure ton code dans le script c'est ca mon problème
pour t'orienter sans faire ton travail, il me semble qu'il faut considérer ton projet comme l'entretien d'une table de données, qui consiste à la comparaison et la mise à jour des données (ajout et suppression) par rapport à l'existant.
comparaison :
- l'existant est dans la table de données, alors afficher la durée d'existence. Est-ce vraiment indispensable ?
mise à jour :
- l'existant n'est pas dans la table de données, alors ajouter l'existant à la table de données
- une donnée dans la table n'est plus dans l'existant, alors supprimer de la table de données
pour l'instant, find ne fait que créer la table de données.
tu vois, ton problème c'est que tu es sorti marcher en regardant le bout tes pieds. tu dois lever les yeux pour déterminer où tu veux aller, et choisir le bon chemin.
rédige un algorithme
Parce que tu n'as pas encore compris que ton script a atteint ses limites car tu l'as bâti sur find ce qui est un mauvais fondement car find ne peut pas tout faire.
Donc le but de cet exemple n'est pas que tu l'inclues dans ton script mais que tu le comprennes pour t'en servir comme bases solides d'un nouveau script. En plus simple, il t'aurait fallu d'abord poser le besoin puis écrire le code qui y répond plutôt que commencer avec "je veux trouver les fichiers" puis "ah mais j'ai oublié je veux aussi la date de" puis "ah mais aussi il faudrait afficher truc" puis "encore une dernière chose, j'aurais besoin de..." et etc etc etc.
Bonjour tout le monde,
J'aurai besoin d'un éclairage pour obtenir un affinement sur les durées de présence de fichiers sur un serveur
Il semblerait que les résultats à la base soient intéressant mais je trouve tout de même un peu imprécis les durées.
Voici le code dont on m'a bien aidé et j'en remercie les contributeurs.
Voici en image les résultatsCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 #!/bin/bash repRecherche=/poche/guibs/sftpusers/ log=/poche/guibs/log/fichierlog.txt ftime=`stat -c %Z $repRecherche` ctime=`date +%s` diff=$(( (ctime - ftime) / 86400 )) #echo $diff >> "$log" if test -n "$(find "$repRecherche" -maxdepth 0 -empty)"; then echo "Aucun fichier n'existe" exit 1 fi find "$repRecherche" -printf "%h/%f : dernier accès le %AA %Ad %AB %AY à %AH:%AM:%.2AS \n dernière modification le %TA %Td %TB à %TH:%TM:%.2TS \n durée de présence du fichier \"$diff\" \n\n\n" -type f \( -name "*.flag" -o -name "*.tar.gz" -o -name "*.zip" -o -name "*.txt" \) > "$log"
Pièce jointe 626422
Premièrement comment éliminer la première ligne ? Elle ne me sert pas puisque c'est le répertoire 'sftpusers" de base dans lequel il y a tous les sous répertoires avec les fichiers déposés dedans.
Deuxièmement comment seulement afficher la durée de présence des fichiers et pas leur répertoire parent ? Exemple pour le fichier "txtfile.txt" je ne souhaite pas afficher la durée de présence du répertoire "int". La ligne "durée de présence du fichier "2"" est incohérente car c'est un répertoire.
Enfin, comment affiner la durée de présence du fichier ? En effet, si je prends "txtfile.txt" ce fichier est présent depuis lundi 26 septembre 2022, nous sommes le vendredi 30 septembre donc cela fait au moins 4 jours
Voila je sèche grandement sur ces points et demande donc votre aide et vous remercie par avance.
en l'état, ton script ne peut pas faire ce que tu veux. relis ma précédente réponse
la table de données existe-t-elle
- oui
- comparer
- mettre à jour
- afficher les résultats
- non
- créer table de données
là, on a un début d'algorithme !
le format de ton fichier log est lisible par humain, ce qui implique qu'il sera très difficile à traiter programmatiquement.
ton fichier log devrait être au format CSV (nom fichier;date accès (depuis Epoch);date modification (depuis Epoch);autres données pertinentes;...) pour être facilement traité par un script.
et c'est le script qui produira un truc lisible naturellement par l'utilisateur.