IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

[BASH] Compter les noms de fichiers communs à deux répertoires


Sujet :

Linux

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2010
    Messages : 129
    Points : 84
    Points
    84
    Par défaut [BASH] Compter les noms de fichiers communs à deux répertoires
    Bonsoir,

    il fallait écrire un script qui prend deux noms de répertoires et qui compte le nombre de fichiers ayant le même nom dans les deux répertoires.

    La stratégie que j'ai écrite, et qui ne fonctionne pas, est de mettre deux boucles imbriquées pour comparer chaque nom de fichier avec chaque fichier de l'autre répertoire.

    L'appel du script est comme ça : ./script /home/sean/rep1 /home/sean/rep2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #!/bin/bash
    compteur=0
    	for file1 in $1/*
    	do
    		for file2 in $2/*
    		do
    			if [ "$file1" = "$file2" ]; then
    				compteur=$((compteur+1))
    			fi
    		done
    	done
    echo "le nombre de fichiers ayant le meme nom est $compteur"
    Merci de votre aide !

  2. #2
    Membre averti Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Points : 300
    Points
    300
    Par défaut
    Citation Envoyé par seanbean Voir le message
    il fallait écrire un script qui prend deux noms de répertoires et qui compte le nombre de fichiers ayant le même nom dans les deux répertoires.

    La stratégie que j'ai écrite, et qui ne fonctionne pas, est de mettre deux boucles imbriquées pour comparer chaque nom de fichier avec chaque fichier de l'autre répertoire.

    L'appel du script est comme ça : ./script /home/sean/rep1 /home/sean/rep2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #!/bin/bash
    compteur=0
    	for file1 in $1/*
    	do
    		for file2 in $2/*
    		do
                            echo "file1='$file1' - file2='$file2'"
    			if [ "$file1" = "$file2" ]; then
    				compteur=$((compteur+1))
    			fi
    		done
    	done
    echo "le nombre de fichiers ayant le meme nom est $compteur"
    La stratégie est bonne mais je vais te mettre sur une piste si tu ajoutes la ligne en gras dans le script.
    Autre chose : si les noms de fichiers contiennent des espaces, ça ne marchera pas non plus.

  3. #3
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Les espaces dans les noms de fichier ne devraient pas poser de problème.

    Avec ton algo ça va vite devenir lent si tu as beaucoup de fichiers dans tes répertoires (complexité en O(n²)). Il serait plus efficace de créer une hash table des fichers du premier répertoire, puis de regarder si les fichiers du deuxième répertoire sont dans la hash table. Tu peux faire ça en awk ou en perl par exemple.

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 539
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 539
    Points : 19 361
    Points
    19 361
    Par défaut
    bah !?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for file in $1/*
    do [ -f "$2/${file##*/}" ] && ((nb++))
    done
    echo "$nb fichiers portent le même nom"
    et pi sc'est tout.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2010
    Messages : 129
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par fransoo Voir le message
    La stratégie est bonne mais je vais te mettre sur une piste si tu ajoutes la ligne en gras dans le script.
    Autre chose : si les noms de fichiers contiennent des espaces, ça ne marchera pas non plus.
    Au fait je cherche exactement le meme fichier sans espace, donc les deux fichiers doivent etre exactement les memes.
    Etant débutant, je ne comprends pas la ligne que t'as ajouté en fait.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2010
    Messages : 129
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par matafan Voir le message
    Les espaces dans les noms de fichier ne devraient pas poser de problème.

    Avec ton algo ça va vite devenir lent si tu as beaucoup de fichiers dans tes répertoires (complexité en O(n²)). Il serait plus efficace de créer une hash table des fichers du premier répertoire, puis de regarder si les fichiers du deuxième répertoire sont dans la hash table. Tu peux faire ça en awk ou en perl par exemple.
    Merci pour ta réponse,
    Hash table?! j'ai cherché sur internet mais je n'ai trouvé aucune réponse
    Peux-tu m'expliquer plus stp ?

  7. #7
    Membre averti Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Points : 300
    Points
    300
    Par défaut
    Citation Envoyé par seanbean Voir le message
    Hash table?!
    C'est un tableau qui au lieu d'avoir des entiers en index peut prendre des strings ou autre en guise d'index.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2010
    Messages : 129
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    bah !?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for file in $1/*
    do [ -f "$2/${file##*/}" ] && ((nb++))
    done
    echo "$nb fichiers portent le même nom"
    et pi sc'est tout.
    J'admire ton intelligence, c'est une trop bonne méthode que j'ai bien compris
    Etant donné que je cherche exactement le meme nom de fichier, j'ai modifié :
    il ne marche toujours pas!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #!/bin/bash
    compteur=0
    	for file in $1/*
    	do
    		if [ -f "$2/$file" ]; then
    			compteur=$((compteur+1))
    		fi
    	done
    echo "le nombre de fichiers ayant le meme nom est $compteur"
    Le problème vient de "$file" qui contient l'ensemble du chemin "/home/sean/Bureau/rep1/lenomdufichier" !!, car j'ai executé ce script pour tester et ça donne le chemin entier dans la variable "$file" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #!/bin/bash
    for fichier in $1/*
    do
    	if [ -f "$fichier" ]; then
    		echo $fichier
    	fi
    done
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    /home/sean/Bureau/rep1/lettre
    /home/sean/Bureau/rep1/photo
    /home/sean/Bureau/rep1/image
    /home/sean/Bureau/rep1/crayon

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2010
    Messages : 129
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par fransoo Voir le message
    C'est un tableau qui au lieu d'avoir des entiers en index peut prendre des strings ou autre en guise d'index.
    Ah d'accord c'est comme en php j'imagine
    Est-ce que vous avez un lien où apprendre cela svp ?

  10. #10
    Membre averti Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Points : 300
    Points
    300
    Par défaut
    Citation Envoyé par seanbean Voir le message
    Ah d'accord c'est comme en php j'imagine
    Est-ce que vous avez un lien où apprendre cela svp ?
    Ben ça dépend : perl, awk, python ... et j'en oublie un tombereau.

    P.S.
    en bash
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ Fichier="/lkhgefz/QEZFKJH/gfj.txt"
    $ echo ${Fichier##*/}
    gfj.txt
    Ce qui remplace avantageusement la commande basename.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2010
    Messages : 129
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par fransoo Voir le message
    Ben ça dépend : perl, awk, python ... et j'en oublie un tombereau.

    P.S.
    en bash
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ Fichier="/lkhgefz/QEZFKJH/gfj.txt"
    $ echo ${Fichier##*/}
    gfj.txt
    Ce qui remplace avantageusement la commande basename.
    Ah oui je vois maintenant merci !!
    Maintenant ça marche, j'ai du coupler les connaissances des linuxiens de developpez pour arriver à ce code qui marche nickel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #!/bin/bash
    compteur=0
    	for file in $1/*
    	do
    		if [ -f "$2/${file##*/}" ]; then
    			compteur=$((compteur+1))
    		fi
    	done
    echo "le nombre de fichiers ayant le meme nom est $compteur"

  12. #12
    Membre averti Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    Points : 300
    Points
    300
    Par défaut
    Citation Envoyé par seanbean Voir le message
    Ah oui je vois maintenant merci !!
    Maintenant ça marche, j'ai du coupler les connaissances des linuxiens de developpez pour arriver à ce code qui marche nickel
    Les Linuxiens sont des gens tordus qui donnent rarement une réponse toute faite mais essayent plutôt de mettre sur la voie
    (Certains parlent même de religion en parlant de Linux, ce qui n'est pas tout faux, il y a même des intégristes )
    On se sent tellement mieux (après) quand on a trouvé soi-même une solution...

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2010
    Messages : 129
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par fransoo Voir le message
    Les Linuxiens sont des gens tordus qui donnent rarement une réponse toute faite mais essayent plutôt de mettre sur la voie
    (Certains parlent même de religion en parlant de Linux, ce qui n'est pas tout faux, il y a même des intégristes )
    On se sent tellement mieux (après) quand on a trouvé soi-même une solution...
    Une religion?! je m'y adhère alors
    Si je continue dans ce forum, je vais devenir un intégriste en linux j'éspère
    T'as raison, je me suis sentis bien après, un bonheur infinie !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lister les noms de fichiers d'un répertoire
    Par Ayok13 dans le forum C++
    Réponses: 8
    Dernier message: 11/09/2014, 17h54
  2. Boucle sur les noms de fichier d'un répertoire
    Par bilou_12 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 13/04/2012, 12h12
  3. [AC-2010] Lister les noms des fichiers d'un répertoire
    Par Invité dans le forum VBA Access
    Réponses: 2
    Dernier message: 23/05/2011, 14h51
  4. Récupération des tous les noms de fichiers d'un répertoire
    Par Ocian dans le forum x86 32-bits / 64-bits
    Réponses: 1
    Dernier message: 19/11/2009, 20h26
  5. Réponses: 2
    Dernier message: 03/09/2008, 18h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo