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

Shell et commandes GNU Discussion :

Suppression de doublons


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    septembre 2005
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : septembre 2005
    Messages : 186
    Points : 88
    Points
    88
    Par défaut Suppression de doublons
    Bonjour à tous,

    J'ai un disque dur de sauvegarde, sur lequel je cherche à supprimer les doublons.
    Par contre, par peur de perdre des informations, je souhaite le faire de façon progressive.

    Je cherchais un outil de détection de doublons mais je n'ai pas trouvé d’utilitaire avec les options qui me conviennent :

    1) Supprimer les doublons par inode:
    J'ai des sauvegardes récursives, avec plusieurs fichiers ayant le même inode.
    Comment supprimer tous ces doublons ?

    2) Supprimer les fichiers qui ont le même contenu ET le mème nom ET la même date.

    3) Avoir la liste des fichiers qui ont le même contenu, avec leur date et leur nom, pour faire de dernier ménage manuellement.

    Merci à vous pour vos conseils

    Nicolas

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    février 2008
    Messages
    6 481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2008
    Messages : 6 481
    Points : 16 871
    Points
    16 871
    Par défaut
    Bonjour,

    plusieurs fichiers ayant le même inode.
    normalement, ce n'est pas possible sur un même système de fichiers.
    Et s'ils ne sont pas sur le même système de fichiers, rien ne dit que ce sont les mêmes fichiers.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    septembre 2005
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : septembre 2005
    Messages : 186
    Points : 88
    Points
    88
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    normalement, ce n'est pas possible sur un même système de fichiers.

    Je me suis mal exprimé.
    Mon objectif est de supprimer les "pointeurs" dans arborescence.

    J'ai un peu avance

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find -type f -printf "%i\t%n\t%s\t%A@\t%f\t%A+\t\"%p\"\t%i\n" | sort -n
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    23494491        30      2223    1608750411.0961266100   koi-win 2020-12-23+21:06:51.0961266100  "./n2/nginx/koi-win"    23494491
    23494491        30      2223    1608750411.0961266100   koi-win 2020-12-23+21:06:51.0961266100  "./n3/n2/nginx/koi-win" 23494491
    23494491        30      2223    1608750411.0961266100   koi-win 2020-12-23+21:06:51.0961266100  "./nginx/koi-win"       23494491
    23494492        30      2837    1608750411.2961160330   koi-utf 2020-12-23+21:06:51.2961160330  "./n2/nginx/koi-utf"    23494492
    23494492        30      2837    1608750411.2961160330   koi-utf 2020-12-23+21:06:51.2961160330  "./n3/n2/nginx/koi-utf" 23494492
    23494492        30      2837    1608750411.2961160330   koi-utf 2020-12-23+21:06:51.2961160330  "./nginx/koi-utf"       23494492
    23494507        30      60      1612309671.5057070760   50-mod-http-xslt-filter.conf    2021-02-03+01:47:51.5057070760  "./n2/nginx/modules-enabled/50-mod-http-xslt-filter.conf"       23494507
    23494507        30      60      1612309671.5057070760   50-mod-http-xslt-filter.conf    2021-02-03+01:47:51.5057070760  "./n3/n2/nginx/modules-enabled/50-mod-http-xslt-filter.conf"    23494507
    23494507        30      60      1612309671.5057070760   50-mod-http-xslt-filter.conf    2021-02-03+01:47:51.5057070760  "./nginx/modules-enabled/50-mod-http-xslt-filter.conf"  23494507
    23494508        30      53      1612309671.5057070760   50-mod-http-echo.conf   2021-02-03+01:47:51.5057070760  "./n2/nginx/modules-enabled/50-mod-http-echo.conf"      23494508
    23494508        30      53      1612309671.5057070760   50-mod-http-echo.conf   2021-02-03+01:47:51.5057070760  "./n3/n2/nginx/modules-enabled/50-mod-http-echo.conf"   23494508
    23494508        30      53      1612309671.5057070760   50-mod-http-echo.conf   2021-02-03+01:47:51.5057070760  "./nginx/modules-enabled/50-mod-http-echo.conf" 23494508
    Reste à garder les lignes "doublons" pour pouvoir les supprimer (et non pas le premier de chaque groupe comme avec | uniq -f7 -d) .

    Merci

  4. #4
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    décembre 2012
    Messages
    3 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : décembre 2012
    Messages : 3 795
    Points : 11 073
    Points
    11 073
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Bonjour,

    normalement, ce n'est pas possible sur un même système de fichiers.
    Et s'ils ne sont pas sur le même système de fichiers, rien ne dit que ce sont les mêmes fichiers.
    Et les lien hard ?
    Cordialement.

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    février 2008
    Messages
    6 481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2008
    Messages : 6 481
    Points : 16 871
    Points
    16 871
    Par défaut
    je suis trop jeune. je n'y ai pas droit.

    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    décembre 2012
    Messages
    3 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : décembre 2012
    Messages : 3 795
    Points : 11 073
    Points
    11 073
    Par défaut
    Peut-être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -type f -not -links 1 -printf "%i %p\n" | awk 'Tab[$1] == 1 {print}{Tab[$1]=1}'
    Ceci t'affichera tout les fichiers doublons d'inode sauf 1 à chaque fois.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ find . -type f -not -links 1 -printf "%i %p\n"
    2890846 ./fic_test_ln3
    2890846 ./fic_test_ln2
    2890846 ./fic_test_ln1
    $ find . -type f -not -links 1 -printf "%i %p\n" | awk 'Tab[$1] == 1 {print}{Tab[$1]=1}'
    2890846 ./fic_test_ln2
    2890846 ./fic_test_ln1
    Cordialement.

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

    Informations forums :
    Inscription : février 2008
    Messages : 6 481
    Points : 16 871
    Points
    16 871
    Par défaut
    je préférais \0 plutôt que \n, avec awk 'BEGIN{ RS="\0" }....

    on ne sait jamais quel peut être
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    septembre 2005
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : septembre 2005
    Messages : 186
    Points : 88
    Points
    88
    Par défaut
    MERCI !!


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    find . -type f -not -links 1 -printf "%i\t%p\n" | awk 'Tab[$1] == 1 {print}{Tab[$1]=1}' | cut -f2 > fichier
    while read i ; do rm "$i" ; done < ./fichier




    Citation Envoyé par N_BaH Voir le message
    je préférais \0 plutôt que \n, avec awk 'BEGIN{ RS='\0" }....

    on ne sait jamais quel peut être
    Je pense qu'il y a une erreur dans les quotes du awk.
    Pas bien compris quoi remplacer.
    Je suis suis preneur de perfectionnement pour éviter tout risque de bêtise dans le cas de fichiers de nom exotique...

  9. #9
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    février 2008
    Messages
    6 481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2008
    Messages : 6 481
    Points : 16 871
    Points
    16 871
    Par défaut
    en effet, c'est RS="\0".

    je corrige.

    et non. pas | cut -f2.
    ->
    awk '...{print $2}...'
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    septembre 2005
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : septembre 2005
    Messages : 186
    Points : 88
    Points
    88
    Par défaut
    J'ai pas tout saisi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -type f -not -links 1 -printf "%i\t%p\0" | awk 'BEGIN{ RS="\0" } {print $2}' | wc -l
    --> 85573
    Il me manque le test.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -type f -not -links 1 -printf "%i\t%p\n" | awk 'Tab[$1] == 1 {print}{Tab[$1]=1}' | cut -f2 | wc -l
    --> 42785

    Je découvre awk

  11. #11
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    février 2008
    Messages
    6 481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2008
    Messages : 6 481
    Points : 16 871
    Points
    16 871
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -type f -not -links 1 -printf "%i\t%p\0" | awk 'BEGIN{ RS="\0" } Tab[$1] == 1 {print $2}{Tab[$1]=1}'
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    septembre 2005
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : septembre 2005
    Messages : 186
    Points : 88
    Points
    88
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -printf "%i\t%p\n" | awk 'Tab[$1] == 1 {print}{Tab[$1]=1}' | cut -f2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ./48/etc/shellinabox/options-available/00+Black on White.css
    ./48/etc/shellinabox/options-available/00_White On Black.css
    ./48/etc/shellinabox/options-available/01+Color Terminal.css
    ./48/etc/shellinabox/options-enabled/00+Black on White.css
    ./48/etc/shellinabox/options-enabled/00_White On Black.css
    ./48/etc/shellinabox/options-enabled/01+Color Terminal.css
    ./48/var/www/html/vendor/datatables/images/Sorting icons.psd
    ./48/usr/lib/python3/dist-packages/setuptools/command/launcher manifest.xml
    ./48/usr/lib/python3/dist-packages/setuptools/script (dev).tmpl




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -printf "%i\t%p\0" | awk 'BEGIN{ RS="\0" } Tab[$1] == 1 {print $2}{Tab[$1]=1}'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ./48/etc/shellinabox/options-available/00+Black
    ./48/etc/shellinabox/options-available/00_White
    ./48/etc/shellinabox/options-available/01+Color
    ./48/etc/shellinabox/options-enabled/00+Black
    ./48/etc/shellinabox/options-enabled/00_White
    ./48/etc/shellinabox/options-enabled/01+Color
    ./48/var/www/html/vendor/datatables/images/Sorting
    ./48/usr/lib/python3/dist-packages/setuptools/command/launcher
    ./48/usr/lib/python3/dist-packages/setuptools/script

  13. #13
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    décembre 2012
    Messages
    3 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : décembre 2012
    Messages : 3 795
    Points : 11 073
    Points
    11 073
    Par défaut
    Ok, le RS='\0' améliore un peu, dans le cas de nom de fichier avec des '\n' mais le print $2 pose problème dans le cas de nom de fichier avec des espaces...

    Le mieux serait donc de mettre un séparateur de champs autre que l'espace que l'on aurait très peu de chance de retrouver dans le nom d'un fichier comme par exemple '\1', ce qui donnerait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ find . -type f -not -links 1 -printf "%i\1%p\0" | awk 'BEGIN{ FS="\1";RS="\0" } ; Tab[$1] == 1 {print "\""$2"\""};{Tab[$1]=1}'
    "./fic_test_ln2"
    "./fic test ln4"
    "./  fic test ln5  "
    "./fic_test_ln1"
    Bon après, ce n'est pas du 100% car on peut créer des noms de fichiers avec des '\0' ou des '\1' .

    Ensuite, avant de faire du nettoyage massif, il est plus que conseiller de vérifier, voir même entre le find et le awk de faire un tri, car le find ne tri pas, il affiche dans l'ordre d'apparition du disque dur.
    Cordialement.

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    septembre 2005
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : septembre 2005
    Messages : 186
    Points : 88
    Points
    88
    Par défaut
    Passons maintenant à l'étape 2.

    Celle qui va enfin faire gagner des Go ....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find /volume1  -type f  -size -100M  -printf "%s\t%T@\t%T+\t%f\t%h\t%i\t%n\t" -exec md5sum {} \; > /volume2/files_with_md5_volume1
    J'ai maintenant un fichier avec tous les fichiers de mon disque de moins de 100Mo (et plein d'infos ).

    En colonne 1 : la taille
    En colonne 2 : le date de modification
    En colonne 4 : le nom du fichier
    En colonne 8 : md5

    3Go le fichier ....

    Je cherche à supprimer les doublons, où ces 4 colonnes sont identiques.

    Donc, avoir 2 fichiers en sortie :
    - les doublons
    - les originaux

    Comment tester plusieurs colonnes avec awk?
    Est ce possible d'avoir 2 sorties distinctes ?

    Merci à vous

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    septembre 2005
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : septembre 2005
    Messages : 186
    Points : 88
    Points
    88
    Par défaut
    J'ai aussi essayé de faire 1 fichier par md5.
    Je me suis aussi perdu...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while read i ; do  md5=`cut -d\t -f8` ; echo "${i}" > "./md5_fichiers/${md5}" ; done < /volume2/files_with_md5_volume1

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    septembre 2005
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : septembre 2005
    Messages : 186
    Points : 88
    Points
    88
    Par défaut
    Je commence à avancer dans la méthode :

    Tout d'abord, trier le tableau suivant plusieurs critères :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sort -t$'\t' -k 1n,1n  -k 8d,8d -k 2n,2n -k 4d,4d   -o ./md5_liste_totale_inf_100Mo__tri_2  -T ./tmp/   ./md5_liste_totale_inf_100Mo
    Ensuite, dans le awk, mémorisée les valeurs de la ligne n-1 pour comparer plusieurs champs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk ' Taille==$1 && Date==$2 && Nom==$4 {/*double*/} {/*original*/}   ;Taille=$1 ; Date=$2 ; Nom=$4 ; md5=$8'
    Est-il possible de rediriger vers 2 flux différents ?

    Sinon, je vais créer une colonne supplémentaire avec "double" ou "original"

    Merci à vous

  17. #17
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    septembre 2005
    Messages
    4 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : septembre 2005
    Messages : 4 673
    Points : 11 723
    Points
    11 723
    Par défaut
    Bonjour

    Est-il possible de rediriger vers 2 flux différents ?
    Je n'ai pas lu toute la discussion. Mais la réponse à cette question est "oui".
    2 exemples :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '(NR%2==0){print >"fichier1.out.txt";} (NR%2==1){print >"fichier2.out.txt";}' fichier.in.txt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ awk '(NR%2==0){print >"fichier1.out.txt";} (NR%2==1){print >"fichier2.out.txt";}' <<eof
    > p
    > o
    > l
    > i
    > eof
    $ cat fichier1.out.txt
    o
    i
    $ cat fichier2.out.txt
    p
    l
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '(NR%2==0){print >"/dev/stdout";} (NR%2==1){print >"/dev/stderr";}' fichier.in.txt
    Code : 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
    $ awk '(NR%2==0){print >"/dev/stdout";} (NR%2==1){print >"/dev/stderr";}' <<eof
    p
    o
    l
    i
    eof
     
    p
    o
    l
    i
    $ awk '(NR%2==0){print >"/dev/stdout";} (NR%2==1){print >"/dev/stderr";}' <<eof >/dev/null
    p
    o
    l
    i
    eof
     
    p
    l
    $ awk '(NR%2==0){print >"/dev/stdout";} (NR%2==1){print >"/dev/stderr";}' <<eof 2>/dev/null
    p
    o
    l
    i
    eof
     
    o
    i
    ok ?
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

Discussions similaires

  1. Suppression de doublons et insertion
    Par Samish dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 15/08/2005, 21h57
  2. Réponses: 17
    Dernier message: 03/12/2004, 11h17
  3. [langage] Suppression de doublon dans tableau
    Par LFC dans le forum Langage
    Réponses: 5
    Dernier message: 15/04/2004, 14h08
  4. Requête de suppression de doublons : besoin d'aide
    Par biocorp dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/01/2004, 17h04
  5. [LG]Suppression de doublons
    Par moustique31 dans le forum Langage
    Réponses: 5
    Dernier message: 20/12/2003, 21h03

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