Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 24/10/2005, à 01:11

Black_pignouf

Script pour fdupes

Bonjour à tous!

Pour faire le ménage dans mes fichiers et virer tous les doublons, je viens de télécharger fdupes. Logiciel qui reconnait les fichiers gardés en plus de 2 occurences, même s'ils ont été renommés. Il marche pas mal du tout (il m'a scanné 10000 fichiers en 10 minutes), mais je ne sais pas trop quoi faire de la sortie. Voici un exemple :

fdupes -r help/ save/

pour voir tous les fichiers semblables dans les repertoires help et save, et leur sous repertoires (-r).

Voici ce qui en sort  (tronqué car trop long):



........................
........................
save/help/passer_de_hoary_a_breezy_fichiers/ajax.js
help/java2_files/ajax.js
help/eclipse_files/ajax.js
help/passer_de_hoary_a_breezy_fichiers/ajax.js
save/help/java2_files/ajax.js
save/help/eclipse_files/ajax.js

save/help/passer_de_hoary_a_breezy_fichiers/tw-sack.js
help/java2_files/tw-sack.js
help/eclipse_files/tw-sack.js
help/passer_de_hoary_a_breezy_fichiers/tw-sack.js
save/help/java2_files/tw-sack.js
save/help/eclipse_files/tw-sack.js

save/help/check.html
help/check.html

save/help/check_fichiers/2707.jpg
help/check_fichiers/2707.jpg

save/help/check_fichiers/tongue.png
help/check_fichiers/tongue.png

save/help/java2.html
help/java2.html

save/BitTorrent/NOFX - PiD
save/BitTorrent/Nofx - The war on errorism.rar-[www.seedler.org]

Plusieurs questions me viennent à l'esprit :

-si les fichiers en double sont trop nombreux, comment puis-je voir l'intégralité de la sortie? Car le terminal me coupe une grosse partie, et je ne peux pas remonter assez loin pour tout voir. Existe t il un .log dans lequel sont stockés les sorties écran?
-ce qui m'interesserait, ce serait de supprimer toutes les occurences, sauf une pour chaque fichier (et si possible, en gardant toujours l'original dans un répertoire donné). J'imagine bien qu'avec une liste de fichiers à supprimer, ce serait pas trop dur de le faire avec un script, mais je n'ai aucune idée de comment écrire ce script.

A noter :
il existe une option interessante (-f) dans fdupes, pour montrer tous les fichiers en double, sauf un. En supprimant toute la liste obtenue, on ne garderait qu'une occurence pour chaque fichier.
Dans l'exemple précédent,

 fdupes -rf help/ save/

on obtient

........
........
help/java2_files/ajax.js
help/eclipse_files/ajax.js
help/passer_de_hoary_a_breezy_fichiers/ajax.js
save/help/java2_files/ajax.js
save/help/eclipse_files/ajax.js

help/java2_files/tw-sack.js
help/eclipse_files/tw-sack.js
help/passer_de_hoary_a_breezy_fichiers/tw-sack.js
save/help/java2_files/tw-sack.js
save/help/eclipse_files/tw-sack.js

help/check.html

help/check_fichiers/2707.jpg

help/check_fichiers/tongue.png

help/java2.html

save/BitTorrent/Nofx - The war on errorism.rar-[www.seedler.org]

Comment puis-je faire?

Merci beaucoup de votre attention (comme toujours wink )

Eric

Hors ligne

#2 Le 24/10/2005, à 02:57

etiennez

Re : Script pour fdupes

Pour pouvoir parcourir les résultats, il faut tuber la sortie standard dans un visionneur de texte ainsi :

$ fdupes -r help/ save/ | less

(peux être pratique pour d'autres commandes aussi wink)

Pour supprimer les doublons générer par -f:

$ for doublon in `fdupes -rf help/ save/ ` ; do rm -i $doublon; done

J'ai mis l'option "-i" a rm pour qu'il demande confirmation a chaque suppression de fichier, si tu es sur de toi, tu peux l'enlever.

Autre possibilité, tu peux generer un fichier des doublons:

$ fdupes -r help/ save/ > doublons.txt

Puis tu édites ton fichier et enlèves les lignes des fichiers que tu veux conserver.
Puis tu executes la commande (attention, je n'ai pas mis de -i a rm ici) :

$ for doublon in `cat doublons.txt ` ; do rm $doublon; done

I'm a good boy.

Hors ligne

#3 Le 24/10/2005, à 08:24

Black_pignouf

Re : Script pour fdupes

Eh ben! Merci beaucoup, vraiment!

C'est effectivement pratique de pouvoir "tuber" la sortie.
Et le reste a pas l'air mal du tout : mais je ne veux pas tester ca maintenant, j'ai trop peur de virer tous mes fichiers.
On verra ca ce soir.

Encore merci,

Eric

PS : ah! voici une question subsidiaire : il y a de la place pour un if dans la comande si je veux supprimer tous les doublons présents dans rep1/ et jamais dans rep2/ ? (Je viens de comprendre à l'instant ta deuxième solution, qui pourrait marcher dans ce cas là. Mais pas avec 10000 fichiers wink )

Dernière modification par Black_pignouf (Le 24/10/2005, à 08:31)

Hors ligne

#4 Le 24/10/2005, à 08:29

Black_pignouf

Re : Script pour fdupes

Je viens d'utiliser ton script etiennez et ca marche très bien, sauf pour les fichiers contenant des espaces :

par exemple pour

save/BitTorrent/Nofx - The war on errorism.rar-[www.seedler.org]

il sort :

rm: no se puede borrar «save/BitTorrent/Nofx»: No existe el fichero o el directorio
rm: no se puede borrar «-»: No existe el fichero o el directorio
rm: no se puede borrar «The»: No existe el fichero o el directorio
rm: no se puede borrar «war»: No existe el fichero o el directorio
rm: no se puede borrar «on»: No existe el fichero o el directorio
rm: no se puede borrar «errorism.rar-[www.seedler.org]»: No existe el fichero o el directorio

(Ah zut!, c'est de l'espagnol.... mais bon, ca se comprend non? tongue)

Comment puis-je faire?

(Encore merci en tout cas)

Hors ligne

#5 Le 24/10/2005, à 15:53

etiennez

Re : Script pour fdupes

En effet, y a un souci avec les espaces, je ne sais pas trop comment regler ce problème pour le moment.
Par contre j'avais pas vu l'option -d de fdupes qui demande quels fichiers garder, c'est un peu mieux que mes bidouilles smile...


I'm a good boy.

Hors ligne

#6 Le 24/10/2005, à 18:07

Black_pignouf

Re : Script pour fdupes

Rassure toi mon pti etiennez!

Ta bidouille me convient (presque wink ) parfaitement car au moins je ne suis pas obligé de taper 10000 fois "1" ou "2" pour choisir pour chaque fichier celui que je garde ou non.
Il me faut juste trouver une solution pour ces espaces et ce sera bon.

Hors ligne

#7 Le 05/01/2006, à 13:04

LpBv

Re : Script pour fdupes

Bonjour,

Je me permets de ré-upper ce sujet ; en effet, àprès avoir malheureusement importer plusieurs fois les memes repertoires dans ma bibliothèque multimedia ; j'ai parfois des fichiers en double, en triple voire plus ...
En fait, je pensais que l'outil n'importerait pas si le fichier etait deja indexé !

Merci

Hors ligne

#8 Le 31/01/2006, à 09:35

sksbir

Re : Script pour fdupes

concernant la solution pour les espaces, il suffisait de reprendre la solution de etiennez:

MAis avant de lancer des rm à travers vos disques, je vous propose de tester (je précise que je n'ai pas testé ) :

for doublon in `cat doublons.txt ` ; do ls -l  "$doublon"; done

Si il n'y a pas d'injures comme celles de black_pignouf , alors

for doublon in `cat doublons.txt ` ; do rm "$doublon"; done

ATTENTION : je rappelle qu'il semble important d'éditer le fichier doublon.txt , ou d'utiliser les bonnes options de fdupe afin d'éviter de détruire TOUTES les copies d'un même fichier...

je regarderai ça plus en détail ce soir..

qqes mots clés pour faciliter la recherche : fichiers en double doubles doublon doublons

Dernière modification par sksbir (Le 31/01/2006, à 09:43)

Hors ligne

#9 Le 01/02/2006, à 01:15

titof

Re : Script pour fdupes

ta modif ne marche pas... sad

Hors ligne

#10 Le 01/02/2006, à 01:19

titof

Re : Script pour fdupes

il faudrait un script qui renvoie chaque ligne du fichier doublons.txt à chaque appel

Hors ligne

#11 Le 01/02/2006, à 01:46

sksbir

Re : Script pour fdupes

j'ai pas compris ta dernière remarque.

Bon, avec une plateforme ubuntu dans les mains, ça va mieux pour tester moi-même. Alors la forme "for X in blabla" n'est pas valide car elle découpe et remet sur plusieurs lignes chaque ligne contenant un espace.

Voici donc une ligne de commande qui affiche le détail des fichiers doublons présents dans le répertoire courant et les sous-répertoires (et qui marche chez moi) :
fdupes -r -n -f .|grep -v '^$'|while read LIGNE;do ls -l "$LIGNE";done

Le grep au milieu, c'est pour éliminer les lignes vides qui servent de séparateur quand on passe d'un doublon au doublon suivant.

Ceci dit, ça ne sert pas à grand-chose sous cette forme, et je sens qu'il va falloir concocter qqchose de plus malin

Hors ligne

#12 Le 01/02/2006, à 02:38

sksbir

Re : Script pour fdupes

bien, voici un script qui pourrait vous servir : en gros, pour chaque doublon, il affiche la liste des doublons, il demande le(s)quel(s) on veut éliminer, puis il passe au doublon suivant.

Le script est actuellement en mode simulation : il est donc inoffensif avec vos données...

Instruction : créez un fichier monfdup.sh quelque part sur votre machine, et collez-y le contenu ci-dessous:

#!/bin/sh
COMPTEUR=0
NBDOUBLON=0
TMPF=/tmp/monfdupe_$$
trap 'echo break >&2 ; rm $TMPF.* ; exit 12 ' 1 2 3 15

#
# dispatching de la liste des fichiers concernés par chaque doublonnage dans un fichier distinct.
#
fdupes -r -n $*|while read LIGNE
do
        if [ "$LIGNE" = "" ]
        then
                NBDOUBLON=`expr $NBDOUBLON + 1`
                COMPTEUR=0
        else
                COMPTEUR=`expr $COMPTEUR + 1`
                echo "$COMPTEUR : FICHIER : $LIGNE" >> $TMPF.dispatch.$NBDOUBLON
                ls -l "$LIGNE" >> $TMPF.dispatch.$NBDOUBLON
        fi
done
for TRAITEDOUBLON in `ls $TMPF.dispatch.*`
do
        clear
        cat $TRAITEDOUBLON
        echo ========================================================
        echo EXEMPLES :
        echo Taper 1 pour eliminer le doublon de la 1ere ligne
        echo taper [1-3] pour eliminer les fichiers lignes 1 2 3
        echo taper [1,2,4] pour éliminer les fichier lignes 1 2 4
        read CHOIX
        grep "^$CHOIX :" $TRAITEDOUBLON|cut -d: -f3 > $TMPF.tmp
        if [ -s $TMPF.tmp ]
        then
                cat $TMPF.tmp |while read LIGNE
                do
## ici, remplacer ls -l par  rm pour réellement effectuer la suppresion.
                        ls -l "$LIGNE"
                done
        else
                echo PAS DE CONCORDANCE, AUCUNE ACTION EFFECTUEE
        fi
        sleep 4
done
echo FIN
read BIDON
rm $TMPF.*
exit 0

Ensuite, sauvegardez le fichier, puis exécutez le script ainsi:
sh monfdupes.sh /media/hdb1/machasseaudoublons  (en fait, le script attend les mêmes arguments que fdupes)

Pour ceux qui veulent en savoir plus sur la façon dont ça fonctionne :
- étape 1 : dispatching : Pour chaque doublon, le script crée un fichier temporaire contenant la liste de tous les fichiers concernés par ce doublonnage.
- étape 2 : traitement de chaque fichier temporaire...

Pour effectuer réellement les suppressions, il faut modifier le script. C'est indiqué dans le script ce qu'il faut faire...

Dernière modification par sksbir (Le 01/02/2006, à 02:49)

Hors ligne

#13 Le 14/03/2007, à 23:14

bigloof

Re : Script pour fdupes

C'est pas mal du tout ... mais j'ai tellement de doublon que j'éclate la taille des lignes ...
J'ai besoin de faire un sérieux ménage entre les sauvegardes et autres ...
Script très utile.

Est ce que l'option -d de fdupes ne remplit pas cette même fonctionnalité ?


Xubuntu 18.04 64  Xfce et autres PC avec des variantes Xubuntu/Kubuntu en 32 et 64 bits / tablettes Android, téléphones Android

Hors ligne

#14 Le 04/02/2008, à 17:36

ChRiiS

Re : Script pour fdupes

Désolé pour le déterrage de topic mais ça peux toujours servir à quelqu'un.

Moi perso, je fais bêtement un:

 yes 1 | fdupes -rd "`pwd`"

"fdupes -d" recherche tout les doublons et "yes 1" n'en garde qu'un de chaque.

(Biensûr il faut "yes" et "fdupes wink)

#15 Le 01/03/2008, à 14:23

traaf

Re : Script pour fdupes

génial fdupes
(petit comm inutile, juste pour retrouver le topic ds mon historique cool )


Vault106, musique libre, enjoy it /!\

Hors ligne

#16 Le 14/08/2008, à 14:57

BorX

Re : Script pour fdupes

Une petite alerte concernant fdupes :

fdupes -r rep1 rep2

affiche bien les doublons entre rep1 et rep2, mais aussi les doublons au sein de rep1 exclusivement (ou au sein de rep2 exclusivement) !

J'allais proposer la commande suivante sur un autre forum :

fdupes -r rep1 rep2 | grep '^rep2/' | while read fic; do echo "$fic"; done

qui devait supprimer tous les fichiers de rep2 se trouvant dans rep1 (après remplacement du 'echo' par 'rm').
Cependant, il est susceptible d'effacer 2 fichiers similaires dans rep2 !

L'option '-f' (qui omet la première occurrence de chaque groupe de doublons) est donc très très très utile smile

Dernière modification par BorX (Le 14/08/2008, à 14:59)

Hors ligne

#17 Le 10/09/2008, à 17:14

pezzos

Re : Script pour fdupes

Cool, je vais tester ce soir ! J'ai trop de fichiers en double.

Merci à tous !


License ASUR (Adminstration et SécUrité des Réseaux informatiques)
Vous cherchez un hébergement sécurisé, efficace avec un support de pro ? www.DevZero.fr sera votre solution !

Hors ligne

#18 Le 30/06/2009, à 00:01

BorX

Re : Script pour fdupes

Salut, smile

J'ai écrit un script permettant de transformer les fichiers doublons en liens durs (hard links).
Il utilise fdupes qui permet de rechercher les doublons, mais ne permet pas de les lier ensuite.

Ainsi, lorsqu'on a par exemple besoin de place et qu'on n'a pas envie de chercher quels doublons supprimer, lier les doublons entre eux fait qu'ils prennent moins de place sur le disque dur (n fichiers doublons prennent la place d'un seul fichier) tout en gardant leur présence (supprimer l'un ne supprime pas les autres).
Très utile pour les médiathèques (mp3, vidéos, ...), notamment avant une sauvegarde (sur un support ext3 bien sûr wink).
Ce système peut se montrer utile dans d'autres cas de figures, mais ça devient un autre sujet tongue

Tous les détails ici : http://forum.ubuntu-fr.org/viewtopic.php?id=328747

Hors ligne

#19 Le 01/11/2009, à 19:06

dodo65

Re : Script pour fdupes

Pour resoudre le probleme des espaces il suffit de changer le caractere de separation (espace par defaut)
comme ceci:

IFS=$'\n'

Ainsi le caractere de séparation devient le caractere de fin de ligne
Puis vous suivez les instructions de etiennez

etiennez a écrit :

Pour pouvoir parcourir les résultats, il faut tuber la sortie standard dans un visionneur de texte ainsi :

$ fdupes -r help/ save/ | less

(peux être pratique pour d'autres commandes aussi wink)

Pour supprimer les doublons générer par -f:

$ for doublon in `fdupes -rf help/ save/ ` ; do rm -i $doublon; done

J'ai mis l'option "-i" a rm pour qu'il demande confirmation a chaque suppression de fichier, si tu es sur de toi, tu peux l'enlever.

Autre possibilité, tu peux generer un fichier des doublons:

$ fdupes -r help/ save/ > doublons.txt

Puis tu édites ton fichier et enlèves les lignes des fichiers que tu veux conserver.
Puis tu executes la commande (attention, je n'ai pas mis de -i a rm ici) :

$ for doublon in `cat doublons.txt ` ; do rm $doublon; done

Et cela marche tres bien chez moi
Pour retablir le caractere de séparation par un espace

IFS=$' '

Hors ligne

#20 Le 02/01/2010, à 00:10

milkshake

Re : Script pour fdupes

Merci dodo65, c'est magique wink

Hors ligne

#21 Le 14/09/2010, à 03:39

nassertom

Re : Script pour fdupes

Bonsoir,

ne manque t il pas le -f dans l'utilisation d'un fichier ?

et donc plutôt comme ca :

$ fdupes -rf help/ save/ > doublons.txt

Sinon je pense que c'est la cata wink.
Cordialement,

Dernière modification par nassertom (Le 14/09/2010, à 03:41)


C'est la plus radicale manière d'anéantir tout discours que d'isoler chaque chose de tout le reste; car c'est par la mutuelle combinaison des formes que le discours nous est né.
[ Le Sophiste, 259e ]

Hors ligne

#22 Le 31/05/2012, à 03:20

v.corjon

Re : Script pour fdupes

Merci à vous, j'ai pu résoudre mon soucis !

Contexte
écrasement d'une copie de travail SVN avec plusieurs fichiers non encore commités. Fichiers effacés récupérés dans /home/me/recup.
Besoin de retrouver les fichiers dans /home/me/recup qui ont été modifiés par rapport à l'export SVN dans /home/me/work.
Le problème est que des doublons sont présents dans chaque dossier à cause de leur copie SVN, et qu'il ne faut surtout pas les supprimer dans /home/me/work mais uniquement dans /home/me/recup. Tout fichier effacé doit bien sûr avoir son path loggué.
Pour des raisons de simplicité, j'ai choisi d'effectuer la manœuvre en deux fois.

Procédure

  1. Nettoyer doublons présents dans /home/me/recup

  2. Nettoyer doublons présents dans /home/me/recup ET /home/me/work sans toucher à ceux dans /home/me/work

Commentaires sur dossiers et commandes
fdupes -R : recherche de doublons en mode récursif
/home/me/recup : dossier où effacer les doublons
/home/me/work : dossier où rien n'est à effacer
/home/me/doublons-deleted-recup.log : liste des doublons présents dans /home/me/recup
/home/me/doublons-deleted-both.log : liste des doublons présents dans /home/me/recup et /home/me/work
tee : permet d'avoir une sortie écran + fichier
grep -v '^$' : exclure les lignes vides

Script final
pour définir la valeur du IFS (Internal Field Separator) à '\n' (nouvelle ligne)

old_IFS=$IFS
IFS=$'\n'

Nettoyer doublons présents dans /home/me/recup

fdupes -R /home/me/recup | grep -v '^$' | tee /home/me/doublons-deleted-recup.log | while read doublon; do rm "$doublon"; done

Nettoyer doublons présents dans /home/me/recup ET /home/me/work sans toucher à ceux dans /home/me/work

fdupes -R /home/me/recup /home/me/work | grep -v '^$' | grep -v '/home/me/work/' | tee /home/me/doublons-deleted-both.log | while read doublon; do rm "$doublon"; done

Remettre le IFS à sa valeur d'origine

IFS=$old_IFS

Hors ligne

#23 Le 01/11/2012, à 09:55

sdolard

Re : Script pour fdupes

Ma contribution.
Gère correctement les espaces.

#!/bin/bash
INDIR=$1
OUTDIR=$2
FDUPEDFILE="/tmp/fdupes-$RANDOM.txt"

if [ "X$1" == "X" ]; then
	echo "Move duplicated files in a destination directory"
	echo "Usage: $0 srcdir dstdir"
	echo "	srcdir: relative source directory "
	echo "	dstdir: relative destination directory (MUST exists)"
	exit 0
fi

if [ ! -d "$INDIR" ]
then
	echo "the dir '$INDIR' does not exist"
	exit 1
fi

if [ ! -d "$OUTDIR" ]
then
	echo "the dir '$OUTDIR' does not exist"
	exit 1
fi

fdupes -fr "$INDIR" > $FDUPEDFILE

cat $FDUPEDFILE |
while read line;do
	if [ -f "$line" ]
	then
		echo "moving $line in $OUTDIR"
		mv "$line" "$OUTDIR"
	fi  
done

echo "Duplicated file list: $FDUPEDFILE"

Hors ligne