Mise à jour de la date d'accès d'un fichier en ligne [Réglé]

Tonin Membre non connecté
-
- Voir le profil du membre Tonin
- Inscrit le : 02/07/2013
- Groupes :
j'aimerai supprimer des fichiers de cache en fonction de leur dernière date d'accès. Malheureusement, j'ai l'impression que cette date n'est pas mise à jour.
stat chemin/vers/image
Accès : 2021-01-26 02:12:57.445907794 +0100 Modif. : 2022-08-04 15:20:58.086017450 +0200 Changt : 2022-08-04 15:20:58.086017450 +0200 Créé : 2021-01-26 02:12:57.445907794 +0100
Malgré le fait d'avoir été affichée à travers le navigateur, ou directement sur le système avec une visionneuse (telle que gwenview), les données affichées par la commande stat ne changent pas. Il faudra explicitement mettre à jour cette date d'accès pour constater un changement.
touch -a chemin/vers/image stat chemin/vers/image
Accès : 2023-03-29 07:37:27.167441669 +0200 Modif. : 2022-08-04 15:20:58.086017450 +0200 Changt : 2023-03-29 07:37:27.167441669 +0200 Créé : 2021-01-26 02:12:57.445907794 +0100
Ainsi, cette date d'accès est bien modifiable, mais je ne comprends pas pourquoi certains accès ne la mettent pas à jour. Le système de fichier est formaté en ext4.
Edit : coquille dans la description
Édité par Tonin Le 29/03/2023 à 23h21
Mageia 9 | > | Mageia 5 - 32bits - LXDE - Compiz ; ... Mandriva ; ... power pack, Mandrake 7.0 |

Jybz Membre non connecté
-
- Voir le profil du membre Jybz
- Inscrit le : 10/10/2018
- Groupes :
-
Administrateur
-
Forgeron
Arch | Machine | OS |
x86_64 | lenovo x250 | mga9 |
armv7hl | bananapro | mga9 |
aarch64 | Raspberry Pi 4B | mga9 |

Jybz Membre non connecté
-
- Voir le profil du membre Jybz
- Inscrit le : 10/10/2018
- Groupes :
-
Administrateur
-
Forgeron
Arch | Machine | OS |
x86_64 | lenovo x250 | mga9 |
armv7hl | bananapro | mga9 |
aarch64 | Raspberry Pi 4B | mga9 |

Tonin Membre non connecté
-
- Voir le profil du membre Tonin
- Inscrit le : 02/07/2013
- Groupes :
cat /etc/fstab
# Entry for /dev/sda8 : UUID=b9d156cb-70cc-4b43-8c12-02430db5fa4f /home ext4 noatime,acl 1 2
man mount
Il existe donc des alternatives, entre autres : atime, noatime, relatime, strictatime, lazytime, ... etc. Il ne reste plus qu'à chronométrer les temps d'accès et d'écriture, avec ou sans noatime, pour évaluer le coût des différentes options (quelqu'un a-t-il déjà fait ça ? ou connaitrait les ordres de grandeur des gains ou pertes ?). Sinon, peut-être lier la commande `touch -a chemin/vers/image` à certains traitements. Enfin, peut-être qu'écrire un cache aujourd'hui n'est plus un problème, autant le purger de temps en temps. Surtout qu'il ne s'agit pas d'écriture si fréquentes que ça, donc ce n'est pas un problème d'usure en écriture qui me freinerait. Bref, ça dépend.
Dans mon cas, l'alternative pourrais être d'utiliser l'historique d'accès aux images tel qu'enregistré dans la base de données MariaDB pour choisir les fichiers accédés récemment (j'en compte environ 1400).
Mageia 9 | > | Mageia 5 - 32bits - LXDE - Compiz ; ... Mandriva ; ... power pack, Mandrake 7.0 |

Jybz Membre non connecté
-
- Voir le profil du membre Jybz
- Inscrit le : 10/10/2018
- Groupes :
-
Administrateur
-
Forgeron
Arch | Machine | OS |
x86_64 | lenovo x250 | mga9 |
armv7hl | bananapro | mga9 |
aarch64 | Raspberry Pi 4B | mga9 |

Tonin Membre non connecté
-
- Voir le profil du membre Tonin
- Inscrit le : 02/07/2013
- Groupes :
# 1 - marquer comme ayant été accédées les images reformatées (suffixes sq th me la xl xx) consultées la veille. Ensuite,
# 2 - parmi toutes les images reformatées, celles qui n'ont pas été accédées depuis plus d'un an (370 jours) sont supprimées.
Il manque la ligne crontab !
#!/bin/bash yesterday=`date -d 'yesterday 13:00' '+%Y-%m-%d'` sizeArray=( sq th me la xl xx ) # 1 for path_to_image in `mysql --user='uuu' --password='***' --database='piwigo' -sN --execute="SELECT pwg_images.path FROM pwg_images LEFT JOIN pwg_history ON pwg_images.id = pwg_history.image_id WHERE '$yesterday' <= pwg_history.date GROUP BY image_id;"` ; do for suffix in "${sizeArray[@]}" ; do path_to_image_suffixed=`echo "$path_to_image" | sed -e "s/\.jpg/-$suffix.jpg/"` touch -a -c -d $yesterday "/path/to/piwigo/cache/dir/$path_to_image_suffixed" ; done; done ; # 2 for useless_image in `find '/path/to/piwigo/cache/dir/' -name '*.jpg' -type f -atime +370` ; do rm -f "$useless_image" ; done ;
Il serait aussi possible de récupérer la date et l'heure dans la table d'historique, en utilisant awk, mais ça devient un peu trop compliqué pour ce soir, de plus cette précision est superflue pour une commande quotidienne avec cron.
PS : Cela dit, comme il y a plus d'un an de retard de renseignement des dates d'accès sur ces images reformatées "en cache", il pourrait être entrepris de rattraper le retard. À suivre... (?)
Mageia 9 | > | Mageia 5 - 32bits - LXDE - Compiz ; ... Mandriva ; ... power pack, Mandrake 7.0 |

Jybz Membre non connecté
-
- Voir le profil du membre Jybz
- Inscrit le : 10/10/2018
- Groupes :
-
Administrateur
-
Forgeron
l'entête du résultat de la commande mysql,
une ligne d'exemple de contenu,
le pied du résultat de la commande mysql,
et je regarde comment faire (sans awk).
J'ai du mal à comprendre la méthode:
pourquoi une première passe pour modifier l'heure,
puis une seconde passe pour supprimer les fichiers
Alors qu'il suffit de supprimer directement les fichiers dans la première passe (mais pas en utilisant yesterday

Quelques commentaire :
oublier `commande` et utiliser $(commande)
toujours utiliser les accolades pour les variable, même simple variables
utiliser l'iso: date --iso -d 'last year'
au lieu d'une boucle 'for' prenant les résultats de find: find /path -name "${element%\.*}"'*' -delete
Déporter les identifiants:
source ~/credentials.bash ... mysql --user=${db_user} --password="${db_pass}"
avec le contenu de ~/credentials.bash
export db_user='uuu' export db_pass='****'
ainsi; lors du partage du code, jamais par erreur les identifiants ne seront divulgué. (je parle d'expérience

Arch | Machine | OS |
x86_64 | lenovo x250 | mga9 |
armv7hl | bananapro | mga9 |
aarch64 | Raspberry Pi 4B | mga9 |

Tonin Membre non connecté
-
- Voir le profil du membre Tonin
- Inscrit le : 02/07/2013
- Groupes :
#!/bin/bash source ~/credentials.bash # past_day=$(date --iso -d '1 year ago 1 month ago') past_day=$(date --iso -d '370 days ago') # 1 / 1 for path_to_image in `mysql --user="${db_user}" --password="${db_password}" --database='piwigo' -sN --execute="SELECT pwg_images.path FROM pwg_images LEFT JOIN pwg_history ON pwg_images.id = pwg_history.image_id WHERE pwg_history.date < '$past_day' GROUP BY image_id;"` ; do find "path_to_piwigo_image_cache_dir" -name "${path_to_image%\.*}"'*' -delete done ;
Voilà une requête qui permet de reproduire le résultat qu'un montage de partition avec l'option atime aurait permit. La requête remonte à la veille, mais il suffirait de rallonger l'intervalle pour aller plus loin dans le temps :
SELECT path, date, time FROM pwg_images INNER JOIN ( SELECT _max_date.image_id, _max_date.date, MAX(time) AS time FROM pwg_history INNER JOIN ( SELECT image_id, MAX(date) AS date FROM pwg_history WHERE SUBDATE(CURDATE(), INTERVAL 1 DAY) <= date GROUP BY image_id ) AS _max_date ON pwg_history.image_id = _max_date.image_id AND pwg_history.date = _max_date.date GROUP BY image_id, date ) AS _max_datetime ON pwg_images.id = _max_datetime.image_id ;
Format de résultat par défaut :
+-----------------------------------------+------------+----------+ | path | date | time | +-----------------------------------------+------------+----------+ | ./galleries/subdir/picture0958.jpg | 2023-03-20 | 08:35:46 | +-----------------------------------------+------------+----------+
path date time ./galleries/subdir/picture0958.jpg 2023-03-20 08:35:46
Compte tenu du formatage du résultat de la commande mysql, vas-tu utiliser while et read ? (mes essais échouent car la redirection est ambigüe)
while IFS=' ' read -r path date time ; do echo "${time} - ${date} - ${path}" done < $(mysql -sN --execute="SELECT ... ;")
Ce qui marche, la requête avant. La redirection précédente était utilisée pour lire des fichiers texte.
mysql --user="${db_user}" --password="${db_password}" --database="piwigo" -sN --execute="SELECT path, date, time FROM pwg_images INNER JOIN ( SELECT temp1.image_id, temp1.date, MAX(time) AS time FROM pwg_history INNER JOIN ( SELECT image_id, MAX(date) as date FROM pwg_history WHERE SUBDATE(CURDATE(), INTERVAL 1 DAY) <= date GROUP BY image_id ) AS temp1 ON pwg_history.image_id = temp1.image_id AND pwg_history.date = temp1.date GROUP BY image_id, date ) AS temp2 ON pwg_images.id = temp2.image_id ;" | while read path date time ; do for suffix in "${sizeArray[@]}" ; do touch -a -c -d ${date}'T'${time} "${path_to_piwigo_image_cache_dir}/${path_to_image%\.*}-${suffix}.jpg" ; done; done
Édition : accolades
Édité par Tonin Le 02/04/2023 à 10h51
Mageia 9 | > | Mageia 5 - 32bits - LXDE - Compiz ; ... Mandriva ; ... power pack, Mandrake 7.0 |

Jybz Membre non connecté
-
- Voir le profil du membre Jybz
- Inscrit le : 10/10/2018
- Groupes :
-
Administrateur
-
Forgeron
#!/bin/bash content=\ "+-----------------------------------------+------------+----------+ | path | date | time | +-----------------------------------------+------------+----------+ | ./galleries/subdir/picture0958.jpg | 2023-03-20 | 08:35:46 | | ./galleries/subdir/nom a la con.jpg | 2023-03-20 | 08:35:46 | | ./galleries/subdir/j'te jure.jpg | 2023-03-20 | 08:35:46 | +-----------------------------------------+------------+----------+" real_content="$(echo "${content}" | sed -e '1,3d;/^+/d;s/[[:space:]]*|[[:space:]]*/|/g')" IFS=$'\n' for line in $(echo "${real_content}") ; do segmented_line=( $(echo "${line}" | sed -e 's/|/\n/g') ) echo "Voici un fichier : -->${segmented_line[0]}<-- dernier accès le ${segmented_line[1]} à ${segmented_line[2]}" done
résultat:
Voici un fichier : -->./galleries/subdir/picture0958.jpg<-- dernier accès le 2023-03-20 à 08:35:46 Voici un fichier : -->./galleries/subdir/nom a la con.jpg<-- dernier accès le 2023-03-20 à 08:35:46 Voici un fichier : -->./galleries/subdir/j'te jure.jpg<-- dernier accès le 2023-03-20 à 08:35:46
Arch | Machine | OS |
x86_64 | lenovo x250 | mga9 |
armv7hl | bananapro | mga9 |
aarch64 | Raspberry Pi 4B | mga9 |

Tonin Membre non connecté
-
- Voir le profil du membre Tonin
- Inscrit le : 02/07/2013
- Groupes :
Merci beaucoup
Mageia 9 | > | Mageia 5 - 32bits - LXDE - Compiz ; ... Mandriva ; ... power pack, Mandrake 7.0 |

Jybz Membre non connecté
-
- Voir le profil du membre Jybz
- Inscrit le : 10/10/2018
- Groupes :
-
Administrateur
-
Forgeron

Arch | Machine | OS |
x86_64 | lenovo x250 | mga9 |
armv7hl | bananapro | mga9 |
aarch64 | Raspberry Pi 4B | mga9 |

Tonin Membre non connecté
-
- Voir le profil du membre Tonin
- Inscrit le : 02/07/2013
- Groupes :
real_content="$(echo "${content}" | sed -e '/^+/d;s/[[:space:]]*|[[:space:]]*/|/g;s/^|//g;s/|$//g')" echo "${real_content}" | awk 'BEGIN {FS = "|"; printf("%40s %15s %-8s\n","path","date","time")}NR>1{printf("%40s %15s %-8s\n",$1,$2,$3)}'
path date time ./galleries/subdir/picture0958.jpg 2023-03-20 08:35:46 ./galleries/subdir/une espace.jpg 2023-03-20 08:35:46 ./galleries/subdir/l'apostrophe.jpg 2023-03-20 08:35:46
NB : il semble que les options de la commande mysql -Ns ne soient pas nécessaires via pipe, ni pour awk, ni pour read.
mysql --user="${db_user}" --password="${db_password}" --database="piwigo" --execute="SELECT path, date, time FROM pwg_images INNER JOIN ( SELECT temp1.image_id, temp1.date, MAX(time) AS time FROM pwg_history INNER JOIN ( SELECT image_id, MAX(date) as date FROM pwg_history WHERE '2023-03-19' <= date GROUP BY image_id ) AS temp1 ON pwg_history.image_id = temp1.image_id AND pwg_history.date = temp1.date GROUP BY image_id, date ) AS temp2 ON pwg_images.id = temp2.image_id ;" | awk 'BEGIN{printf("%90s %10s %-8s\n","path","date","time")}NR>1{printf("%90s %s %s\n",$1,$2,$3)}' mysql --user="${db_user}" --password="${db_password}" --database="piwigo" --execute="SELECT path, date, time FROM pwg_images INNER JOIN ( SELECT temp1.image_id, temp1.date, MAX(time) AS time FROM pwg_history INNER JOIN ( SELECT image_id, MAX(date) as date FROM pwg_history WHERE '2023-03-19' <= date GROUP BY image_id ) AS temp1 ON pwg_history.image_id = temp1.image_id AND pwg_history.date = temp1.date GROUP BY image_id, date ) AS temp2 ON pwg_images.id = temp2.image_id ;" | while read path date time ; do echo ${time} ${date} ${path} ; done
Édition : accolades
Édité par Tonin Le 04/04/2023 à 13h43
Mageia 9 | > | Mageia 5 - 32bits - LXDE - Compiz ; ... Mandriva ; ... power pack, Mandrake 7.0 |

Jybz Membre non connecté
-
- Voir le profil du membre Jybz
- Inscrit le : 10/10/2018
- Groupes :
-
Administrateur
-
Forgeron
Mais aussi la requete sql. La date n'est-elle pas un nombre de seconde depuis epoch ? C'est un standard !
Arch | Machine | OS |
x86_64 | lenovo x250 | mga9 |
armv7hl | bananapro | mga9 |
aarch64 | Raspberry Pi 4B | mga9 |

Jybz Membre non connecté
-
- Voir le profil du membre Jybz
- Inscrit le : 10/10/2018
- Groupes :
-
Administrateur
-
Forgeron
Pour le traiter avec avec bash par la suite, il y a des espaces avant et après, et potentiellement dedans.
Arch | Machine | OS |
x86_64 | lenovo x250 | mga9 |
armv7hl | bananapro | mga9 |
aarch64 | Raspberry Pi 4B | mga9 |

Tonin Membre non connecté
-
- Voir le profil du membre Tonin
- Inscrit le : 02/07/2013
- Groupes :
Mageia 9 | > | Mageia 5 - 32bits - LXDE - Compiz ; ... Mandriva ; ... power pack, Mandrake 7.0 |