[bash] aide pour un petit script
Résolu
hssissen
Messages postés
844
Date d'inscription
Statut
Membre
Dernière intervention
-
vec_8 Messages postés 2 Date d'inscription Statut Membre Dernière intervention -
vec_8 Messages postés 2 Date d'inscription Statut Membre Dernière intervention -
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
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
A voir également:
- [bash] aide pour un petit script
- Script vidéo youtube - Guide
- Mas script - Accueil - Windows
- Ghost script - Télécharger - Polices de caractères
- Trier du plus petit au plus grand excel - Guide
- Petit 3 ✓ - Forum Word
3 réponses
Hello ...
Voici une solution (j'espère :-))
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
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
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 :
Puis tu remplace le test
par celui-ci
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 :
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
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
Merci de tes reponses.
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 ...
Merci encore une fois.
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 :
puis tu exécutes le script. Il devrait théoriquement te dire que fichier1.txt et fichier3.txt sont identiques ...