#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 )
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 )
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 )
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? )
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 ...
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 ) 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...
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 )
#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 )
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
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,
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 ).
Ce système peut se montrer utile dans d'autres cas de figures, mais ça devient un autre sujet
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
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 )
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
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 .
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
Nettoyer doublons présents dans /home/me/recup
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