#1 Le 08/07/2008, à 16:31
- Miloose
[Résolu] script pour comparer le contenus de deux dossiers
Bonjour,
Voilà mon problème. Quand hardy est sorti, un bug faisait que si on copiait un fichier, plutôt que de garder la date du fichier original, le fichier copié recevait la date de l'exécution de la copie. Ce bug est entre-temps corrigé, merci pour lui.
Oui mais voilà, je me suis mis en tête de déplacer toutes mes données sur un autre disque, ceci sans savoir que ce bug existait. Bref, je déplace tout, j'efface les données de mon disque original et quelques jours après je me rends compte que tous mes fichiers sont à la date du 11 juin. Embêtant... Heureusement, je fais des backups en lignes de mes données, et j'ai encore les fichiers avec les dates originales sur ce backup. Fin du mois de juin (histoire de tuer mon quota de download, y'en a pour 17 Gb tout de même), je rapatrie toutes mes données depuis ce backup.
Donc, j'ai deux sets de données. Un avec les bonnes dates, mais ne contenant les modifications que jusqu'au 11 juin, et un autre avec les mauvaises dates, mais contenant les dernières modifications. J'ai fait une recherche avec Nautilus pour regarder quels étaient les fichiers modifiés après le 11 juin pour les copier dans mon set de données rapatriées. Donc, en théorie, j'ai maintenant deux sets de données identiques, sauf que l'un a les mauvaises dates et l'autre les bonnes. Mais voilà, j'ai quand même du mal à effacer mon set de données avec les mauvaises dates, qui sait qu'une modification m'aurait échappé pour une raison ou une autre.
D'où mon idée de comparer fichier par fichier pour être sûr que le contenu est bien le même. Et c'est là que je cale. J'ai bien trouvé des solutions pour comparés des fichiers textes, mais il ya de tout sur ce disque (bcp de photos, des documents aux formats divers, etc...). Donc mon idée, ce serait de faire un md5sum des fichiers sur chaque disque et de les comparer pour être sûr que ce sont les mêmes. J'imagine que ça doit être facile à faire, mais voilà, je suis sous Linux depuis 8 mois, et je n'en suis pas encore là dans mon apprentissage des scripts. J'ai bien vu que la commande md5sum pouvait être exécutée pour un dossier entier, mais pas pour les sous-dossiers, sinon je pouvais encore m'en sortir tout seul en mettant les résultats de cette commande dans un tableur et en comparant. Mais vu le nombre de sous-dossiers, ça me semble fastidieux.
Quelqu'un saurait m'aider ?
On renseignerait au script les deux dossiers à comparer (qui contiennent en fait le même nombre de fichiers et sous-dossiers, les noms de ces fichiers et sous-dossiers étant les mêmes dans les deux dossiers), et il ressortirait le nom des fichiers qui seraient différents.
C'est possible ça ? (Oui c'est possible, faut juste que qqn m'aide... ;-))
merci beaucoup
Dernière modification par Miloose (Le 08/07/2008, à 21:25)
Hors ligne
#2 Le 08/07/2008, à 16:41
- Totor
Re : [Résolu] script pour comparer le contenus de deux dossiers
Oui, effectivement c'est possible (comme bcp de choses heureusement ) :
#!/bin/bash
dos1=$1
dos2=$2
resultat=$3
for fic1 in `find ${dos1} -type f`
do
fic2=`echo ${fich}|sed "s/${dos1}/${dos2}/"`
if [ -a ${fic2} ]; then
md5f1=`md5sum ${fic1}|cut -f1 -d" "`
md5f2=`md5sum ${fic2}|cut -f1 -d" "`
if [ "${md5f1}" != "${md5f2}" ]; then
echo "les fichiers ${fic1} et ${fic2} diffèrent." |tee -a ${resultat}
fi
else
echo "fichier ${fic2} non trouvé." |tee -a ${resultat}
fi
done
voilà qui devrait faire l'affaire (mais je n'ai pas testé )
pour l'utilisation :
nomscript <dossier1> <dossier2> <nom_fichier_log>
Dernière modification par Totor (Le 10/07/2008, à 15:03)
-- Lucid Lynx --
Hors ligne
#3 Le 08/07/2008, à 20:19
- Spalax
Re : [Résolu] script pour comparer le contenus de deux dossiers
Autre solution (un poil plus simple ).
diff -rq dossier1 dossier2
Affiche (récursivement) quels fichiers sont présents dans un répertoire mais pas dans l'autre, et pour les fichiers présents dans les deux, dit s'ils diffèrent.
man diff pour plus d'infos.
Hors ligne
#4 Le 08/07/2008, à 20:22
- Spalax
Re : [Résolu] script pour comparer le contenus de deux dossiers
Et Totor, ton script a un défaut (qui ne devrait pas gêner Miloose vu la description de son problème) : il n'est pas symétrique.
Si un fichier est présent dans le répertoire 1 mais pas dans le 2, ton script le signale. Mais si un fichier est présent dans le second répertoire mais pas dans le premier, rien n'est affiché.
Hors ligne
#5 Le 08/07/2008, à 21:02
- Totor
Re : [Résolu] script pour comparer le contenus de deux dossiers
Et Totor, ton script a un défaut (qui ne devrait pas gêner Miloose vu la description de son problème) : il n'est pas symétrique.
Si un fichier est présent dans le répertoire 1 mais pas dans le 2, ton script le signale. Mais si un fichier est présent dans le second répertoire mais pas dans le premier, rien n'est affiché.
j'y ai pensé mais ce n'est pas grave ! il suffit de l'appeler en inversant les dossiers
quand à diff, j'y avais aussi pensé mais la demande portait sur kl'utilisation du md5sum !:D
-- Lucid Lynx --
Hors ligne
#6 Le 08/07/2008, à 21:12
- Spalax
Re : [Résolu] script pour comparer le contenus de deux dossiers
Désolé, je n'avais pas vu les md5sum.
Mais j'ai l'impression que la seule utilisation que voulait faire Miloose du md5sum est la comparaison de fichiers, ce que diff fait très bien.
Hors ligne
#7 Le 08/07/2008, à 21:24
- Miloose
Re : [Résolu] script pour comparer le contenus de deux dossiers
Merci les gars.
J'avais cru comprendre que diff ne fonctionnait que pour les fichiers textes. D'où mon idée d'utiliser md5sum. Mais j'ai du louper qqch car diff fait en effet mon bonheur.
Merci à Totor pour la peine, je vais quand même prendre la peine de regarder son script, comme ça j'apprends...
Hors ligne
#8 Le 10/10/2009, à 10:26
- bugs néo
Re : [Résolu] script pour comparer le contenus de deux dossiers
heu le script de Totor ne marche pas il renvoi l'erreur
sed: -e expression n°1, caractère 9: option inconnue pour `s'
jeu de course open source earth-race (le jeu est en réécriture complète depuis janvier, afin de pouvoir aller plus vite par la suite)
Hors ligne
#9 Le 10/10/2009, à 14:55
- Link31
Re : [Résolu] script pour comparer le contenus de deux dossiers
heu le script de Totor ne marche pas il renvoi l'erreur
sed: -e expression n°1, caractère 9: option inconnue pour `s'
Les chemins de tes dossiers passés au script ne doivent pas contenir de slash : "/".
Ou alors, tu peux modifier "s/${dos1}/${dos2}/" en "s@${dos1}@${dos2}@", mais il faudra que les chemins de tes dossiers ne contiennent pas de caractères "@"
Hors ligne
#10 Le 10/10/2009, à 15:33
- bugs néo
Re : [Résolu] script pour comparer le contenus de deux dossiers
bon ben j'ai trouver sa marche aussi avec | merci quand même
jeu de course open source earth-race (le jeu est en réécriture complète depuis janvier, afin de pouvoir aller plus vite par la suite)
Hors ligne
#11 Le 10/10/2009, à 15:43
- Link31
Re : [Résolu] script pour comparer le contenus de deux dossiers
Ça marche avec n'importe quel caractère, pourvu qu'il ne soit pas présent dans le reste de la commande et ne corresponde pas à un paramètre de la commande sed.
Dernière modification par Link31 (Le 10/10/2009, à 15:44)
Hors ligne
#12 Le 10/10/2009, à 15:53
- bugs néo
Re : [Résolu] script pour comparer le contenus de deux dossiers
ok merci du renseignement
jeu de course open source earth-race (le jeu est en réécriture complète depuis janvier, afin de pouvoir aller plus vite par la suite)
Hors ligne
#13 Le 10/10/2009, à 15:56
- bugs néo
Re : [Résolu] script pour comparer le contenus de deux dossiers
j'ai un peu modifié le programme pour ne pas faire des md5sum mais pour ce basé sur la taille des fichiers et j'ai un soucis c'est que sa ne marche pas avec des fichiers dont les noms contiennent des espaces comment faire pour résoudre ce problème? ( j'ai mis le nouveau programme ici : http://forum.ubuntu-fr.org/viewtopic.ph … 1#p2976501
jeu de course open source earth-race (le jeu est en réécriture complète depuis janvier, afin de pouvoir aller plus vite par la suite)
Hors ligne
#14 Le 10/10/2009, à 18:24
- Totor
Re : [Résolu] script pour comparer le contenus de deux dossiers
heu le script de Totor ne marche pas il renvoi l'erreur
sed: -e expression n°1, caractère 9: option inconnue pour `s'
Oulà... c'est un très vieux sujet ça ... c'était au moment de mes début en scripting....
Voilà comment je procéderai maintenant :
#!/bin/bash
function compare
{
dossier1="$1"
dossier2="$2"
resultat="$3"
while read fichier1
do
tee -a "${resultat}" <<< "${fichier1}"
fichier2="${fichier1/${dossier1}/${dossier2}}"
if [ -e "${fichier2}" ]; then
taille1=$(stat -c%s "${fichier1}")
taille2=$(stat -c%s "${fichier2}")
if [ ${taille1} -ne ${taille2} ]; then
echo "les fichiers ${fic1} et ${fic2} diffèrent." |tee -a "${resultat}"
cp "${fichier1}" "${fichier2}"
fi
else
echo "Fichier ${fichier2} non trouvé." |tee -a "${resultat}"
cp "${fichier1}" "${fichier2}"
fi
done < <(find "${dossier1}" -type f)
}
[ -e "$3" ] && rm -f "$3"
compare "$1" "$2" "$3"
# au besoin, mais je ne pense pas dans ton cas :
#compare "$2" "$1" "$3"
Normalement, en terme de performance, c'est nettement mieux ainsi et il ne risque pas d'y avoir un problème de caractère ni d'espace dans les noms de fichiers...
-- Lucid Lynx --
Hors ligne
#15 Le 10/10/2009, à 18:31
- bugs néo
Re : [Résolu] script pour comparer le contenus de deux dossiers
heu je ne comprend pas tout le script, donc si tu veux bien expliqué un peu plus je suis preneur. D'ailleurs je précise que je n'ai pas besoin de log.
Et ton while read fichier1 doit posé problème car tu na pas défini fichié1 auparavant.
idem pour $fic1 et $fic2 dans la phrase qui dit qu'ils sont diférent je pense que tu voulais écrire fichier 1 et fichier2
Dernière modification par bugs néo (Le 10/10/2009, à 18:36)
jeu de course open source earth-race (le jeu est en réécriture complète depuis janvier, afin de pouvoir aller plus vite par la suite)
Hors ligne
#16 Le 10/10/2009, à 19:10
- bugs néo
Re : [Résolu] script pour comparer le contenus de deux dossiers
Bon ben ton programme marche mais je comprend vraiment pas comment par contre quand il faut créer un dossier il n'en n'est pas capable.
Alors ben je veut bien toujours des explications sur comment il marche.
et puis à la rigeur savoir comment faire pour mettre en place la création des dossier nécéssaire
jeu de course open source earth-race (le jeu est en réécriture complète depuis janvier, afin de pouvoir aller plus vite par la suite)
Hors ligne
#17 Le 10/10/2009, à 20:16
- Totor
Re : [Résolu] script pour comparer le contenus de deux dossiers
quand il faut créer un dossier il n'en n'est pas capable
As-tu cherché au moins ?
Voilà une nouvelle version intégrant la création du dossier :
#!/bin/bash
function compare
{
dossier1="$1"
dossier2="$2"
resultat="$3"
while read fichier1
do
tee -a "${resultat}" <<< "${fichier1}"
fichier2="${fichier1/${dossier1}/${dossier2}}"
if [ -e "${fichier2}" ]; then
taille1=$(stat -c%s "${fichier1}")
taille2=$(stat -c%s "${fichier2}")
if [ ${taille1} -ne ${taille2} ]; then
tee -a "${resultat}" <<< "les fichiers ${fichier1} et ${fichier2} diffèrent."
[ !-d "${fichier2%/*}" ] && mkdir -p "${fichier2%/*}"
cp "${fichier1}" "${fichier2}"
fi
else
tee -a "${resultat}" <<< "Fichier ${fichier2} non trouvé."
[ !-d "${fichier2%/*}" ] && mkdir -p "${fichier2%/*}"
cp "${fichier1}" "${fichier2}"
fi
done < <(find "${dossier1}" -type f)
}
[ -e "$3" ] && rm -f "$3"
compare "$1" "$2" "$3"
# au besoin, mais je ne pense pas dans ton cas :
#compare "$2" "$1" "$3"
Dernière modification par Totor (Le 10/10/2009, à 20:17)
-- Lucid Lynx --
Hors ligne
#18 Le 10/10/2009, à 22:18
- bugs néo
Re : [Résolu] script pour comparer le contenus de deux dossiers
bah j'avais quand même essayé mais vu que je me suis mis au bash hier j'avais un peu de mal.
Bon il manquait juste un espace entre ! et -d mais sinon ton script est parfait merci.
Dernière modification par bugs néo (Le 10/10/2009, à 22:30)
jeu de course open source earth-race (le jeu est en réécriture complète depuis janvier, afin de pouvoir aller plus vite par la suite)
Hors ligne