Lister tout le contenu d'un disque dur dans une table mysql

Fermé
xunil2003 Messages postés 765 Date d'inscription mercredi 17 novembre 2004 Statut Membre Dernière intervention 5 septembre 2024 - 14 janv. 2014 à 19:36
 Utilisateur anonyme - 16 janv. 2014 à 12:40
Bonjour,

J'ai un disque dur médiathèque où je mets toutes mes vidéos de mes DVD, photos et manuels.
Je voudrais pouvoir insérer automatiquement dans une table mysql depuis un script bash, tous les noms de fichiers avec le chemin d'accès complet au fichier, listé sur mon disque dur.
Pour cela j'avais pensé faire ceci, mais ça marche pas vraiment.

cd /mnt/mediatheque/
for i in 'tree'
do
echo "$i"
echo "$i" >> $HOME/Documents/mediatheque.txt
done
cd ~
exit 0

Comment dois-je m'y prendre d'après vous ?

Merci.

A voir également:

3 réponses

mamiemando Messages postés 33274 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 septembre 2024 7 783
Modifié par mamiemando le 15/01/2014 à 11:16
Il faut que ton script shell construise une chaîne avec la bonne requête SQL. Ça devrait ressembler à quelque chose dans ce genre :

#!/bin/bash

table="ma_table"
database="ma_base"
mysql="mysql -D $database -e"
folder="$HOME/Documents"
for filename in $(find $folder -type f)
do
  $mysql "'INSERT INTO $table (ma_colonne) VALUES ($filename)'"
done

exit 0


Ici je suppose que la colonne qui stocke le nom du fichier s'appelle "ma_colonne" et que la table "ma_table" a une seule colonne ou un index auto incrémenté. Adapte la requête SQL en fonction de la structure de ta table.

Tu notes que ni le login, ni l'host, ni le mot de passe n'apparaissent en clair dans le script. On fait cela pour éviter que des informations sensibles n'apparaissent en clair dans ce script, mais du coup il faut que ces informations soient définies dans le fichier
~/.my.cnf
:
http://dev.mysql.com/doc/refman/5.0/fr/option-files.html

[client]
# Le mot de passe suivant sera envoyé par tous les clients standards MySQL
user = root
password = "my_password"
host = localhost

Note : pour voir certaines des possibilités offertes par ce fichier, tu peux aussi t'inspirer du contenu de
/etc/mysql/debian.cnf
.

Puis attribue à ce fichier des droits restreints :

sudo chmod 700 ~/.my.cnf

Bonne chance
0
salut,

la boucle
for
pourrait s'avérer nocive si le nom d'un fichier contient un espace, ou autre caractère non imprimable.
en effet, la boucle va exécuter les commandes sur chaque mot que la substitution de commande va produire.

find "$startDir" -type f -exec mysql -e "INSERT INTO $table_mysql (column_name) VALUES ("{}")" \;
ou
find "$startDir" -type f -print0 | xargs -0 -I{} mysql -e "INSERT INTO $table_mysql (column_name) VALUES ({})"; done
mais je ne peux pas tester :(
ou
find "$startDir" -type f -print0 | while IFS="" read -d '' f; do mysql "INSERT ... ($f)"; done
0
mamiemando Messages postés 33274 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 septembre 2024 7 783
16 janv. 2014 à 01:45
Oui tout à fait :-)
0
xunil2003 Messages postés 765 Date d'inscription mercredi 17 novembre 2004 Statut Membre Dernière intervention 5 septembre 2024 14
Modifié par xunil2003 le 16/01/2014 à 12:19
Bonjour

Oui il y avait bien un problème avec les noms des fichiers qui contiennent un ou des espaces.
J'ai fait un essai dans un fichier texte pour l'instant, ça marche impeccable

startDir="/mnt/mediatheque"
echo "" > $HOME/Documents/mediatheque.txt
find "$startDir" -type f -print0 | while IFS="" read -d '' f; do echo "$f" >> $HOME/Documents/mediatheque.txt; done

Merci.
0
ici, la boucle
while
ne sert à rien :
find "$startDir" -type f -fprint $HOME/Documents/mediatheque.txt
ensuite, tu lis le fichier avec une boucle
while
.
0