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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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 expérimenté Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    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 Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    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 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    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 confirmé
    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
    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

  6. #6
    Membre confirmé
    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
    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 expérimenté Avatar de fransoo
    Inscrit en
    Novembre 2009
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 209
    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 confirmé
    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
    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 ?

  9. #9
    Membre confirmé
    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
    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.

+ 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, 16h54
  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, 11h12
  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, 13h51
  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, 19h26
  5. Réponses: 2
    Dernier message: 03/09/2008, 17h14

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