Je souhaite réaliser un script bash qui compare en BDD si les images d'un dossier spécifique existent,
voici mon script :
#!/bin/bash
dbname="intranet_carc_development"
username="benjamin"
tab2=( $(ls -ap public/uploads/files | grep -v "/$") )
test () {
echo $i
}
test2 () {
rm public/uploads/files/$i
}
for i in ${tab2[*]}
do
psql $dbname $username << EOF
SELECT CASE WHEN EXISTS (SELECT * FROM public.articles WHERE content LIKE '%$i%') THEN 'existe' ELSE 'suppression de $i....$(test2) ' END;
EOF
echo $i
done
Lors de l'execution du script il differencie bien les images etant en BDD et celle ne l'etant pas : voici le resulat pour une image qui est en bdd et l'autre qui n'y est pas :
benjamin@ubuntu:~/GBNA_intranet/intranet.carc$ ./purge_files.sh
case
-----------------------------------
suppression de copie_a.3.png....
(1 row)
copie_a.3.png
case
--------
existe
(1 row)
pLDQZ0f8OvFGMfRZS4UqDw.png
jusque la tout vas bien , Cependant, lors de la supressions des image, "THEN $(lancement de la fonction )"
par contre, au niveau du script, le tableau ne sert à rien, et la substitution de commande peut générer des erreurs dans les noms des fichiers :
for f in public/uploads/files/*
do
test -f "$f" && psql "$db" "$user" <<eof
select case ... else '$(rm $f)' end;
eof
done
je trouve bizarre d'effectuer une substitution de commande dans psql. il n'y a pas moyen, à la place, d'indiquer, par une fonction psql, un code retour pour psql (à l'instar d'un return pour une fonction) ?
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
par contre, au niveau du script, le tableau ne sert à rien, et la substitution de commande peut générer des erreurs dans les noms des fichiers :
for f in public/uploads/files/*
do
test -f "$f" && psql "$db" "$user" <<eof
select case ... else '$(rm $f)' end;
eof
done
je trouve bizarre d'effectuer une substitution de commande dans psql. il n'y a pas moyen, à la place, d'indiquer, par une fonction psql, un code retour pour psql (à l'instar d'un return pour une fonction) ?
Bonjour,
Merci pour ta reponse,
Si je prend ton exemple, le for va comparer en BDD le nom des fichiers avec le chemin "public/uploads/files...." je me suis donc servis du Tableau pour le grep
Tout de meme si j'adapte ton code mais en utilisant le tableau cela donne :
benjamin@ubuntu:~/GBNA_intranet/intranet.carc$ ./purge_files.sh
rm: cannot remove 'fyPq0TsDemhhhbkywRbJaQ.jpeg': No such file or directory
case
-------------------
le fichier existe
(1 row)
rm: cannot remove 'k3yrdQrHvr5YfOPHbgI7uw.png': No such file or directory
case
-------------------
le fichier existe
(1 row)
rm: cannot remove 'QWMeGlbFxq2TVHWozTCA2g.png': No such file or directory
case
-------------------
supp en cours...
(1 row)
(je ne prend pas en compte le fait qu'il ne trouve pas le fichier ) Le plus bizarre dans tout ça c'est que le script veux absolument supprimer tous les fichier alors que seulement le dernier devrait être supprimé (il y a le petit message supp en cours ...)
SELECT CASE WHEN EXISTS (SELECT * FROM public.articles WHERE content LIKE '%$file%') THEN 'le fichier existe' ELSE 'supp en cours... $(rm $file)' END;
j'ai cherché pour utiliser une fonction psql mais aucuns resultats, il y a surement la solution quelque part, c'est seulement que je ne la trouve pas..
rm ne trouve pas de fichiers parce que le tableau ne contient que les noms des fichiers, pas leur chemin, que la fonction, elle, ajoute !
il vaut mieux utiliser les globs du shell (comme je l'ai montré), que ls. de même, lorsqu'on remplit un tableau avec des noms de fichiers, il vaut mieux faire une boucle for sur le répertoire, et tester que ce sont des fichiers, plutôt qu'une substitution de commande qui risque d'éclater les noms en fonction de l'IFS.
je ne suis, par ailleurs, pas sûr que ce soit psql qui exécute la suppression des fichiers : la substitution de commande à lieu dans le document en ligne (entre les eof). ce qui expliquerait que tous les fichiers sont supprimés.
- Edité par dantonq 7 mai 2018 à 17:34:43
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
GNU nano 2.5.3 File: purge_files.sh
#!/bin/bash
dbname="intranet_carc_development"
username="benjamin"
for f in public/uploads/files/*
do
psql $dbname $username << EOF
SELECT CASE WHEN EXISTS (SELECT * FROM public.articles WHERE content LIKE '%$f%') THEN 'le fichier e$
EOF
done
Le problème est qu'il y a 2 fichiers qui existent et un qui n'existe pas, cependant lors de l’exécution du script tous les fichiers sont supprimés
pour vérifier que le code de retour de psql change selon que l'enregistrement existe (ou pas) :
for f in "$chemin"/*
do
if test -f "$f"
then
psql $dB $user -c 'select * from table where field like "%$f%"' && echo "$f existe dans la DB" || echo "$f n'a pas été trouvé : je supprime"
done
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Tout d'abord merci pour ton aide , donc voici le résultat a présent :
#!/bin/bash
db="intranet_carc_development"
user="benjamin"
chemin="public/uploads/files"
for f in "$chemin"/*
do
if test -f "$f"
then
psql $db $user -c 'select * from public.articles where content like "%$f%"' && echo "$f existe dans la DB" || echo "$f n'a pas été trouvé : je supprime"
fi
done
et la console me retourne :
./purge_files.sh
ERROR: column "%$f%" does not exist
LINE 1: select * from public.articles where content like "%$f%"
^
public/uploads/files/3W8tzRk2bLMcVXoX5TAUig.pdf n'a pas été trouvé : je supprime
ERROR: column "%$f%" does not exist
LINE 1: select * from public.articles where content like "%$f%"
^
public/uploads/files/b--QuF4yPobetjIqogMiyw.jpeg n'a pas été trouvé : je supprime
ERROR: column "%$f%" does not exist
LINE 1: select * from public.articles where content like "%$f%"
^
public/uploads/files/Dp_HlC39gEany7tcsxD1iA.png n'a pas été trouvé : je supprime
ERROR: column "%$f%" does not exist
LINE 1: select * from public.articles where content like "%$f%"
^
public/uploads/files/HetHDbPNEsiKNl_3pKb8ng.png n'a pas été trouvé : je supprime
ERROR: column "%$f%" does not exist
LINE 1: select * from public.articles where content like "%$f%"
^
public/uploads/files/KRxoOUsN5FktZuyszSjw4A.png n'a pas été trouvé : je supprime
ERROR: column "%$f%" does not exist
LINE 1: select * from public.articles where content like "%$f%"
^
public/uploads/files/_nVevDz_u31x28LyWRxllA.png n'a pas été trouvé : je supprime
#!/bin/bash
db="intranet_carc_development"
user="benjamin"
chemin="public/uploads/files"
for f in "$chemin"/*
do
if test -f "$f"
then
#test1
psql $db $user -c 'select * from public.articles where content like png' && echo "$f existe dans la DB" || echo "$f n'a pas été trouvé : je supprime"
#test2
psql $db $user -c 'select * from public.articles where content like "png"' && echo "$f existe dans la DB" || echo "$f n'a pas été trouvé : je supprime"
fi
done
J'ai meme essayer avec ton astuce mais a chaque fois il me dit que la colum n'existe pas
public/uploads/files/r-BntUPF69PI79KdjtS-_Q.jpeg n'a pas été trouvé : je supprime
ERROR: column "png" does not exist
LINE 1: select * from public.articles where content like png
^
public/uploads/files/rlo0ewRDXTnNZZFXidiGew.jpeg n'a pas été trouvé : je supprime
ERROR: column "png" does not exist
LINE 1: select * from public.articles where content like png
^
public/uploads/files/SNBwNyO6D_xp235mP69OOw.jpeg n'a pas été trouvé : je supprime
ERROR: column "png" does not exist
LINE 1: select * from public.articles where content like png
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Script Bash
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique
Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique