Forum des développeurs  

Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé.
Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Linux > Système

Système Vos questions autour de l'administration système

Réponse
 
Outils de la discussion
Vieux 28/08/2008, 10h52   #1 (permalink)
Invité de passage
 
Date d'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...
K-roT est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 28/08/2008, 12h36   #2 (permalink)
Membre Expert
 
Avatar de frp31
 
Date d'inscription: juillet 2006
Localisation: toulouse
Messages: 1 474
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 :
[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 :
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
__________________
Bye @+
(\__/)
(o..o)
(") (")

Soutenez le logiciel libre
frp31 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 28/08/2008, 13h50   #3 (permalink)
Membre du Club
 
Date d'inscription: avril 2006
Messages: 88
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...
clebig est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 28/08/2008, 13h50   #4 (permalink)
Membre éclairé
 
Avatar de Tchetch
 
Date d'inscription: mars 2002
Localisation: Martigny, VS, CH
Âge: 23
Messages: 329
Par défaut

Salut,

Code :
$ 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 :
$ sudo aptitude install fdupes
(ou tout autre commande correspondant à ta distribution.

T.
__________________
Mon wiki (on y parle Debian principalement) : http://www.tchetch.net/
Tchetch est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 28/08/2008, 14h17   #5 (permalink)
Invité de passage
 
Date d'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 ^^)

Dernière modification par K-roT ; 28/08/2008 à 14h40
K-roT est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 28/08/2008, 14h38   #6 (permalink)
Membre Expert
 
Avatar de frp31
 
Date d'inscription: juillet 2006
Localisation: toulouse
Messages: 1 474
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 :
[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.
__________________
Bye @+
(\__/)
(o..o)
(") (")

Soutenez le logiciel libre
frp31 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 28/08/2008, 14h41   #7 (permalink)
Membre Expert
 
Avatar de frp31
 
Date d'inscription: juillet 2006
Localisation: toulouse
Messages: 1 474
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 ....
__________________
Bye @+
(\__/)
(o..o)
(") (")

Soutenez le logiciel libre
frp31 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 28/08/2008, 15h51   #8 (permalink)
Membre éclairé
 
Avatar de Tchetch
 
Date d'inscription: mars 2002
Localisation: Martigny, VS, CH
Âge: 23
Messages: 329
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 :
#!/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;
 
__________________
Mon wiki (on y parle Debian principalement) : http://www.tchetch.net/
Tchetch est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 28/08/2008, 16h30   #9 (permalink)
Invité de passage
 
Date d'inscription: août 2008
Messages: 3
Par défaut

J'ai pu avancer grandement dans mon projet grace a vous!
Je n'ai pas de doublon maintenant c sur!
Je clos le post.
Merci beaucoup!
@+
K-roT est déconnecté   Envoyer un message privé Réponse avec citation
Réponse

Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Linux > Système



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide