25-05-21, 17:26
(Modification du message : 26-05-21, 17:12 par Scap.
Raison de la modification: problème d'interlignes dans le message
)
Bonjour,
A force de persévérance j'ai fini pas réussir à lancer purge_non_existing_images sous Windows 10.
Je vais détailler ici les étapes afin d'aider ceux qui comme moi utilisent cet OS et qui peinent à faire fonctionner le script.
1. Suivre les instructions de Dready_ras, étapes 1 à 3.
2. Suivre les instructions de ce lien suivant, à partir du paragraphe "Exécuter le script Shell sur Windows 10 avec Git Bash"
3. Suivre les instructions de cette vidéo. Il faut bien faire attention à ajouter le chemin vers le dossier dans la variable "path" et pas ailleurs.
4. Localiser le script. il se trouve normalement sous "C:\Program Files\darktable\share\darktable\tools\"
5. Ouvrir git bash
6. Glisser le script dans git bash et valider
Attention, ça ne fonctionnera normalement pas car le script va chercher la librairie ici : "D:\Users\votre_username\.config\darktable\" or, la librairie est en fait sous "D:\User\votre_username\AppData\Local\darktable". En tout cas c'était comme ça pour moi, par conséquent, si c'est aussi le cas pour vous, il faut :
7. Modifier la ligne 20 du script de la façon suivante.
Enfin, il faut recommencer l'étape 6 et le script devrait fonctionner.
Il faut ajouter --purge à la fin du chemin affiché pour purger la base de données.
Chez moi ça supprime malheureusement toute la base... il y a un problème dans le script au niveau du test
Pour un raison que j'ignore encore cette condition est toujours vraie, donc tous les fichiers de la base sont considérés non-existants...
Peut-être que le problème se situe au niveau de cette ligne qui ne fonctionne pas pareil sous Windows ?
Si quelqu'un a une idée je suis preneur
---
EDIT
Voici ma solution pour utiliser purge_non_existing_images sous Windows 10
J'ai modifié la ligne 20 (configdir) et modifié la boucle While qui lit la base de donnée pour supprimer le CR sur les paths lus.
Maintenant le script fonctionne pour moi
A force de persévérance j'ai fini pas réussir à lancer purge_non_existing_images sous Windows 10.
Je vais détailler ici les étapes afin d'aider ceux qui comme moi utilisent cet OS et qui peinent à faire fonctionner le script.
1. Suivre les instructions de Dready_ras, étapes 1 à 3.
2. Suivre les instructions de ce lien suivant, à partir du paragraphe "Exécuter le script Shell sur Windows 10 avec Git Bash"
3. Suivre les instructions de cette vidéo. Il faut bien faire attention à ajouter le chemin vers le dossier dans la variable "path" et pas ailleurs.
4. Localiser le script. il se trouve normalement sous "C:\Program Files\darktable\share\darktable\tools\"
5. Ouvrir git bash
6. Glisser le script dans git bash et valider
Attention, ça ne fonctionnera normalement pas car le script va chercher la librairie ici : "D:\Users\votre_username\.config\darktable\" or, la librairie est en fait sous "D:\User\votre_username\AppData\Local\darktable". En tout cas c'était comme ça pour moi, par conséquent, si c'est aussi le cas pour vous, il faut :
7. Modifier la ligne 20 du script de la façon suivante.
Code :
configdir="${HOME}/AppData/Local/darktable"
Enfin, il faut recommencer l'étape 6 et le script devrait fonctionner.
Il faut ajouter --purge à la fin du chemin affiché pour purger la base de données.
Chez moi ça supprime malheureusement toute la base... il y a un problème dans le script au niveau du test
Code :
if ! [ -f "$path" ]
Pour un raison que j'ignore encore cette condition est toujours vraie, donc tous les fichiers de la base sont considérés non-existants...
Peut-être que le problème se situe au niveau de cette ligne qui ne fonctionne pas pareil sous Windows ?
Code :
QUERY="SELECT images.id, film_rolls.folder || '/' || images.filename FROM images JOIN film_rolls ON images.film_id = film_rolls.id"
Si quelqu'un a une idée je suis preneur
---
EDIT
Voici ma solution pour utiliser purge_non_existing_images sous Windows 10
J'ai modifié la ligne 20 (configdir) et modifié la boucle While qui lit la base de donnée pour supprimer le CR sur les paths lus.
Maintenant le script fonctionne pour moi
Code :
#!/bin/bash
#
# Usage: purge_non_existing_images [-p]
# -p do the purge, otherwise only display non existing images
#
if ! command -v sqlite3 >/dev/null
then
echo "error: please install sqlite3 binary".
exit 1
fi
if pgrep -x "darktable" >/dev/null
then
echo "error: darktable is running, please exit first"
exit 1
fi
#configdir="${HOME}/.config/darktable"
configdir="${HOME}/AppData/Local/darktable"
DBFILE="${configdir}/library.db"
dryrun=1
library=""
# remember the command line to show it in the end when not purging
commandline="$0 $*"
# handle command line arguments
while [ "$#" -ge 1 ]
do
option="$1"
case "$option" in
-h | --help)
echo "Delete non existing images from darktable's database"
echo "Usage: ${0} [options]"
echo ""
echo "Options:"
echo " -c|--configdir <path> path to the darktable config directory"
echo " (default: '${configdir}')"
echo " -l|--library <path> path to the library.db"
echo " (default: '${DBFILE}')"
echo " -p|--purge actually delete the tags instead of just finding them"
exit 0
;;
-l | --library)
library="$2"
shift
;;
-c | --configdir)
configdir="$2"
shift
;;
-p | --purge)
dryrun=0
;;
*)
echo "warning: ignoring unknown option ${option}"
;;
esac
shift
done
DBFILE="$configdir/library.db"
if [ "$library" != "" ]
then
DBFILE="$library"
fi
if [ ! -f "$DBFILE" ]
then
echo "error: library db '${DBFILE}' doesn't exist"
exit 1
fi
QUERY="SELECT images.id, film_rolls.folder || '/' || images.filename FROM images JOIN film_rolls ON images.film_id = film_rolls.id"
echo "Removing the following non existent file(s):"
while read -r -u 9 id path
do
pathTMP=$(echo $path | tr -d '\r')
#echo "a $pathTMP b"
if ! [ -f "$pathTMP" ]
then
echo " ${pathTMP} with ID = ${id}"
ids="${ids+${ids},}${id}"
fi
done 9< <(sqlite3 -separator $'\t' "$DBFILE" "$QUERY")
if [ "$dryrun" -eq 0 ]
then
for table in images meta_data
do
sqlite3 "$DBFILE" <<< "DELETE FROM ${table} WHERE id IN ($ids)"
done
for table in color_labels history masks_history selected_images tagged_images history_hash module_order
do
sqlite3 "$DBFILE" <<< "DELETE FROM ${table} WHERE imgid in ($ids)"
done
# delete now-empty film rolls
sqlite3 "$DBFILE" "DELETE FROM film_rolls WHERE NOT EXISTS (SELECT 1 FROM images WHERE images.film_id = film_rolls.id)"
sqlite3 "$DBFILE" "VACUUM; ANALYZE"
else
echo
echo Remove following now-empty filmrolls:
sqlite3 "$DBFILE" "SELECT folder FROM film_rolls WHERE NOT EXISTS (SELECT 1 FROM images WHERE images.film_id = film_rolls.id)"
echo
echo to really remove non existing images from the database call:
echo "${commandline} --purge"
fi