[bash] aide pour un petit script

Résolu/Fermé
hssissen Messages postés 844 Date d'inscription mercredi 20 juillet 2005 Statut Membre Dernière intervention 9 janvier 2017 - 14 mars 2007 à 16:50
vec_8 Messages postés 2 Date d'inscription lundi 1 décembre 2008 Statut Membre Dernière intervention 1 décembre 2008 - 1 déc. 2008 à 02:59
Salut a tous,
Voila, j'ai un repertoire avec une liste de fichiers de donnees texte avec meme format de saisie.
Ce que je veux faire c'est juste comparer 2 a 2 les fichiers du reperoire pour detecter s'il y a des fichiers identiques. J'ai pense a introduire un ls -B au debut, mais comment le faire 2 a 2 avec la commande diff.
Et dans ce repertoire ce trouve le script en question, comment l'eviter dans ls pour qu'il ne fasse pas la comparaison avec le reste des fichiers.
Merci pour toute reponse et bonne continuation

3 réponses

jpzuate Messages postés 56 Date d'inscription dimanche 4 mars 2007 Statut Contributeur Dernière intervention 9 juin 2008 51
Modifié le 15 mars 2007 à 16:05
Hello ...

Voici une solution (j'espère :-))
#!/usr/bin/bash 

# 
# On valorise LISTE_FICHIERS avec une liste (ls) 
# Sauf le programme lui meme (basename ${0}) 
# $(xxxx) permet d'utiliser l'output d'une commande comme 
# un contenu de variable 
LISTE_FICHIERS=$(ls | grep -v $(basename ${0})) 

for FICHIER_1 in ${LISTE_FICHIERS} 
do 
 # 
 # Si repertoire, on passe au suivant 
 [ -d ${FICHIER_1} ] && continue 

 # 
 # Checksum du fichier 1 
 CKS_F1=$(cksum ${FICHIER_1} | awk '{ printf "%s%s\n", $1, $2}') 

 for FICHIER_2 in ${LISTE_FICHIERS} 
 do 
 # 
 # Si repertoire, on passe au suivant 
  [ -d ${FICHIER_2} ] && continue 

  # 
  # Si on examine le meme fichier, on passe au suivant 
  [ ${FICHIER_1} = ${FICHIER_2} ] && continue 

  # 
  # Checksum du fichier 2 
  CKS_F2=$(cksum ${FICHIER_2} | awk '{ printf "%s%s\n", $1, $2}') 

  # 
  # Si les 2 checksum sont egaux, c'est le meme contenu (meme si ce n'est pas le meme nom) 
  [ ${CKS_F1} -eq ${CKS_F2} ] && echo "${FICHIER_1} et ${FICHIER_2} sont identiques" 
 done 
done 


Seul défaut à mon programme : il te donnera 2 fois l'information (A est identique à B et B est identique à A)

Hope this help :-)
Jean-Pierre Zuate
2
hssissen Messages postés 844 Date d'inscription mercredi 20 juillet 2005 Statut Membre Dernière intervention 9 janvier 2017 50
14 mars 2007 à 17:37
Merci beaucoup jpzuate, je vais le tester et te tenir au courant.
0
hssissen Messages postés 844 Date d'inscription mercredi 20 juillet 2005 Statut Membre Dernière intervention 9 janvier 2017 50
14 mars 2007 à 17:45
Est-ce que possible de le faire sur des fichiers zippés avec .zip?
Merci de tes reponses.
0
jpzuate Messages postés 56 Date d'inscription dimanche 4 mars 2007 Statut Contributeur Dernière intervention 9 juin 2008 51 > hssissen Messages postés 844 Date d'inscription mercredi 20 juillet 2005 Statut Membre Dernière intervention 9 janvier 2017
14 mars 2007 à 17:51
(re)

Oui, bien entendu (ça devrait en tout cas). La commande cksum prend le checksum d'un fichier et compte le nombre de bytes.

Définition du checksum : http://www.dicodunet.com/definitions/google/checksum.htm

On gros avec le checksum on sait dire si ton fichier a été modifié ou pas, le chiffre qui vient après dit le nombre d'octets. La concaténation des 2 fait que, dans ton cas, tu peux en déduire qu'il s'agit du même fichier, mais qui porte un autre nom ...
0
hssissen Messages postés 844 Date d'inscription mercredi 20 juillet 2005 Statut Membre Dernière intervention 9 janvier 2017 50 > jpzuate Messages postés 56 Date d'inscription dimanche 4 mars 2007 Statut Contributeur Dernière intervention 9 juin 2008
14 mars 2007 à 19:46
Il s'execute sans erreurs, mais a la fin il n'affiche rien??pourtant dans ton script il y a bine des echo. As-tu une idée pourquoi?
Merci encore une fois.
0
jpzuate Messages postés 56 Date d'inscription dimanche 4 mars 2007 Statut Contributeur Dernière intervention 9 juin 2008 51 > hssissen Messages postés 844 Date d'inscription mercredi 20 juillet 2005 Statut Membre Dernière intervention 9 janvier 2017
14 mars 2007 à 20:16
Salut,

S'il n'affiche rien, c'est peut-être qu'il n'y a pas 2 fichiers identiques dans ton répertoire ! ;-)

tu peux faire le test suivant :
mkdir repertoire
cd repertoire
cp mon_script .
ls -l > fichier1.txt
ps -ef > fichier2.txt
cp fichier1.txt fichier3.txt

puis tu exécutes le script. Il devrait théoriquement te dire que fichier1.txt et fichier3.txt sont identiques ...
0
jpzuate Messages postés 56 Date d'inscription dimanche 4 mars 2007 Statut Contributeur Dernière intervention 9 juin 2008 51
Modifié le 15 mars 2007 à 16:05
Pour émettre un message du style "tous les fichiers sont identiques", tu ajoutes après l'initialisation de la variable LISTE_FICHIERS le code suivant :
NB_FIC_IDENTIQUES=0


Puis tu remplace le test
[ ${CKS_F1} -eq ${CKS_F2} ] && echo "${FICHIER_1} et ${FICHIER_2} sont identiques"

par celui-ci
if [ ${CKS_F1} -eq ${CKS_F2} ] 
       echo "${FICHIER_1} et ${FICHIER_2} sont identiques" 
       NB_FIC_IDENTIQUES=$(( ${NB_FIC_IDENTIQUES} + 1 )) 
fi 

nb : je n'ai pas bien compris si tu souhaitais voir la liste des fichiers identiques, ou différents, ou ne rien voir. Selon le cas, tu enlève la ligne avec echo, ou tu en met une autre condtionnée par un else ...

Et à la fin du programme, tu ajoute :
[ ${NB_FIC_IDENTIQUES} -ne 0 ] && echo "Il n'y a pas de fichiers identiques dans le repertoire ${PWD}" 


diff pourquoi pas mais il va te montrer les différences entre 2 fichiers, or à priori ce n'est pas ce que tu cherches. Tu cherches à détecter si ils sont différents. Comparer le checksum me paraît dans ce cas plus opportun. En effet, le diff va effectuer une traitement sur chaque ligne de chaque fichier pour déterminer là où ils sont différents, alors que cksum va juste calculer le checksum et le nombre d'octets, ce qui est à priori plus rapide, en tout cas plus simple et je pense plus logique.

J'espère avoir répondu à tes attentes ...
Jean-Pierre Zuate
0
hssissen Messages postés 844 Date d'inscription mercredi 20 juillet 2005 Statut Membre Dernière intervention 9 janvier 2017 50
14 mars 2007 à 22:11
J'espère avoir répondu à tes attentes
Et plus que j'en esperais. Au passage, j'ai zippé 2 fichiers textes identiques, mais il ne le detecte pas. Donc, je prefere dezipper mais fichiers ensuite executer ce script.
Merci beaucoup Jean-Pierre et bonne soirée.
0
jpzuate Messages postés 56 Date d'inscription dimanche 4 mars 2007 Statut Contributeur Dernière intervention 9 juin 2008 51 > hssissen Messages postés 844 Date d'inscription mercredi 20 juillet 2005 Statut Membre Dernière intervention 9 janvier 2017
15 mars 2007 à 16:05
Hello,

Idée pour tes fichiers ZIP (mais sans grand garantie nonobstant) : peut-être tu peux remplacer cette ligne (et celle en rapport avec FICHIER_2) :
cksum ${FICHIER_1} | awk '{ printf "%s%s\n", $1, $2}'

par celle-ci
md5sum ${FICHIER_1} | awk '{ printf "%s\n", $1}'


Cdt
0
vec_8 Messages postés 2 Date d'inscription lundi 1 décembre 2008 Statut Membre Dernière intervention 1 décembre 2008
1 déc. 2008 à 02:59
Bonjour,
Je souhaiterai réaliser une comparaison analogue mais dans deux répertoires différents qui aurai une arborescence très proche. Pour supprimer les doublons dans le premier répertoire. Serait-il possible d'adapter ce script?


Merci d'avance


vec
0