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

Administration système Discussion :

Trouver Doublon dans un dossier


Sujet :

Administration système

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 3
    Par défaut Trouver Doublon dans un dossier
    Bonjour a tous,
    C'est mon premier post!!
    Je suis sous unix(solaris) depuis peu de temps, j'ai plus de 14000 fichiers dans un dossier et je désirerai trouver les doublons dans ces fichiers à l'aide d'une commande dans mon terminal mais je n'y arrive pas...
    Pour certain cela doit paraitre facile mais pour moi la... je sèche ^^
    Quelqu'un peut'il m'aider?
    Merci d'avance...

  2. #2
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    tu veux comparer tous les fichiers avec tous les autres?

    le mieux est de faire une commande décomposée.

    pour tout fichier
    --- charger la taille
    --- pour tout fichier de taille identique sauf lui même
    ------ commande diff
    ------ si identique prévenir
    --- fin boucle
    fin boucle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [root@SINAGIOSS50 scripts]# for i in * ; do (taill=$(ls -lrt $i | awk '{print $5}'); echo $i $taill ;for j in $(ls -lrt | grep $taill | grep -v $i |awk '{print $9}') ; do echo $j ; diff $i $j > /dev/null ; if [ $? -eq 0 ] ; then echo "\n*******fichier $i $j $taill identiques\n******** "  ; echo $i -- $j ; fi; done ) ; done
    ce qui donne genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    migration_bases_rrd_nagiosgraph_PNP.sh.old
    migration_bases_rrd_nagiosgraph_PNP.sh.new
    import_bases_rrd.sh
    removeramdisk.sh
    toto
    relance-applis.sh 726
    removeramdisk.sh 150
    toto
    \n*******fichier removeramdisk.sh toto 150 identiques\n**********
    removeramdisk.sh -- toto
    sauvegarde-a-froid.sh 1732
    sauvegarde_bases_rrd.sh 1466
    serviceextinfo.cfg.new 14712
    supervision_ajout.sh 20248

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 87
    Par défaut
    Ou faire la meme chose mais avec md5sum a la place de diff, on peut comme ca retrouver les fichiers binaires identiques ne portant pas le meme nom...

  4. #4
    Membre chevronné Avatar de Tchetch
    Inscrit en
    Mars 2002
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2002
    Messages : 401
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ man fdupes
    FDUPES(1)                                                            FDUPES(1)
     
    NAME
           fdupes - finds duplicate files in a given set of directories
    Et si tu ne l'as pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ sudo aptitude install fdupes
    (ou tout autre commande correspondant à ta distribution.

    T.

  5. #5
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 3
    Par défaut
    En fait je désirerais chercher les doublons seulement sur les noms de fichier et non pas sur son contenu ou sa taille, désolé frp31 j'avait oublié de le préciser...


    Juste pour vous dire je ne peut rien installer sur ce poste car je n'ai pas les droits admin (merci quand même tchetch ^^)

  6. #6
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    il ne peut pas exister de doublons de nom sur unix car il est case sensitive.


    par contre tu peux avoir du tototiti et totottutu
    mais tu n'as que X caracteres communs..

    voir les regexp pour selectionner avec un extrème précision les noms que tu veux chercher dans ton ls

    par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [root@sinagioss80 ~]# touch D5fdsfmt
    [root@sinagioss80 ~]# touch D5fdsfmtt
    [root@sinagioss80 ~]# touch D4fdsfmtt
    [root@sinagioss80 ~]# touch D4fdsfmt
     
    [root@sinagioss80 ~]# ls | grep "^D[1-4].*m."
    D4fdsfmt
    D4fdsfmtt
    [root@sinagioss80 ~]# ls | grep ^D
    D4fdsfmt
    D4fdsfmtt
    D5fdsfmt
    D5fdsfmtt
    dans cet exemple l'expression reguliere ^D[1-4].*m."
    signifie très exactement
    ^D commence par D majuscule
    [1-4] suivi d'un seul chiffre entre 1 & 4
    .* suivi par un nombre quelconque de caracteres quelconques
    m suivi par un m minuscule
    . suivi par un seul caractère quelconque

    ce qui me selectionne bien que 2 fichiers sur les 4 crées...car seuls ces deux correspondent à ces critères.

  7. #7
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    Citation Envoyé par K-roT Voir le message
    En fait je désirerais chercher les doublons seulement sur les noms de fichier et non pas sur son contenu ou sa taille, désolé frp31 j'avait oublié de le préciser...
    Sinon j'ai testé ton script et en réponse j'ai eu "Script started, file is typescript"

    Juste pour vous dire je ne peut rien installer sur ce poste car je n'ai pas les droits admin (merci quand même tchetch ^^)
    la taille n'est testée que pour ne pas faire la commande diff inutillement et que la commande globale ne prenne que 3/5 minutes au lieu de 45/50....

    quand à ton messages d'erreur il faut adapter à l'environnement moi j'utilise du ksh ou bash selon les machines ....

  8. #8
    Membre chevronné Avatar de Tchetch
    Inscrit en
    Mars 2002
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2002
    Messages : 401
    Par défaut
    Citation Envoyé par K-roT
    Juste pour vous dire je ne peut rien installer sur ce poste car je n'ai pas les droits admin (merci quand même tchetch ^^)
    Dans ce cas j'ai un bout de code. En fait j'ai commencé à faire ce programme et un jour un collègue m'a dit "fdupes" et je ne l'ai jamais terminer.
    Mais s'il peut servir, au moins je n'aurais pas perdu mon temps ...

    Fais attention, il prend la racine ('/') comme point de départ (un excès de confiance en soi de faire les tests sur la racine avec les droits root).

    Code perl : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    #!/usr/bin/perl
    #
    use File::Find;
    use Digest::SHA1;
    use Fcntl ':mode';
    use Data::Dumper;
     
    my %files = ();
    my %byUsers = ();
     
    @dirs = ('/');
    find({ wanted => \&hashAndAdd, no_chdir => 1}, @dirs);
     
    sub hashAndAdd {
        my $f = $_;
        if(-f $f and ! -l $f) {
     
            ($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size, $atime,
              $mtime, $ctime, $blksize, $blocks) = stat($f);
            $o = open FILE, $f;
            if($o and $size > 0) {
                my $sha1 = Digest::SHA1->new;
                $sha1->addfile(FILE);
                $d = $sha1->hexdigest;
     
                $files{$d} = [] unless defined $files{$d};
                ($name, $p, $u, $g, $q, $c, $gc, $home) =
                  getpwuid $uid;
                %iUser = (name => $name, home => $home);
                %iFile = (file => $f, size => $size,
                  user => { %iUser } );
     
                $byUsers{$name} = [] unless defined $byUsers{$name};
                push ( @{$files{$d}},  { %iFile });
                push( @{$byUsers{$name}}, ref $files{$d});
            }
            close FILE;
        }
    }
     
     
    print "RESULTS\n\n";
    my $totSize = 0;
    my $fileFOUND = 0;
    foreach $k (keys %files) {
        if(($#{ $files{$k} } + 1) > 1) {
            print "FOR :: " . $k . " :: FOUND\n";
            my $first = 0;
            foreach $a (@{ $files{$k} }) {
                $fileFOUND++;
                print "  -> $a->{file} - $a->{size} - " .
                  "$a->{user}{name} - $a->{user}{home}\n";
                $totSize += $a->{size} unless $first eq 0;
                $first = 1;
            }
        } else {
            delete $files{$k};
        }
    }
    $totSize = $totSize ;
    print "Total wasted size :: $totSize\n";
    print "TOTAL FILES :: $fileFOUND\n";
     
    1;

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

Discussions similaires

  1. comment trouver les bdd dans le dossier oraclexe
    Par nessing dans le forum Oracle
    Réponses: 0
    Dernier message: 21/11/2010, 12h37
  2. Réponses: 4
    Dernier message: 08/04/2009, 09h15
  3. trouver un doublon dans une chaine
    Par ctrl+z dans le forum Langage
    Réponses: 7
    Dernier message: 20/08/2008, 15h03
  4. Trouver un fichier dans un dossier
    Par poukill dans le forum C++
    Réponses: 3
    Dernier message: 08/06/2007, 10h36

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