Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 tongue) :

#!/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é wink)

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 lol).

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

Spalax a écrit :

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 wink

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

bugs néo a écrit :

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 "@" wink

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

bugs néo a écrit :

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

bugs néo a écrit :

quand il faut créer un dossier il n'en n'est pas capable

As-tu cherché au moins ? roll


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