Je cherche un moyen simple (une commande ou une série de commandes, impliquant probablement find
) de trouver des fichiers en double dans deux répertoires et de remplacer les fichiers d'un répertoire par des liens physiques les uns des autres.
Voici la situation: Il s'agit d'un serveur de fichiers sur lequel plusieurs personnes stockent des fichiers audio, chaque utilisateur ayant son propre dossier. Parfois, plusieurs personnes ont des copies des mêmes fichiers audio. En ce moment, ce sont des doublons. Je voudrais faire en sorte qu'ils soient des liens durs, pour économiser de l'espace disque.
Réponses:
Il y a un script Perl à http://cpansearch.perl.org/src/ANDK/Perl-Repository-APC-2.002/eg/trimtrees.pl qui fait exactement ce que vous voulez:
la source
rdfind
est disponible via les gestionnaires de paquets pour TOUTES les grandes plates-formes (os x, linux, (cyg) win, solaris) et fonctionne à une vitesse native fulgurante. Alors, consultez la réponse ci-dessous.[Errno 31] Too many links
. Ce script semble être la seule chose qui gère ça.rdfind
fait exactement ce que vous demandez (et dans l'ordre, pourquoi les listes). Permet de supprimer les doublons, de les remplacer par des liens souples ou physiques. Combiné avecsymlinks
vous, le lien symbolique peut aussi être absolu ou relatif. Vous pouvez même choisir un algorithme de somme de contrôle (md5 ou sha1).Depuis qu'il est compilé, il est plus rapide que la plupart des solutions de script:
time
sur un dossier de 15 Go avec 2600 fichiers sur mon Mac Mini à partir de 2009, retourne cette(en utilisant md5).
Disponible dans la plupart des gestionnaires de paquets (par exemple, MacPorts pour Mac OS X).
la source
rdfind
et aimé. Il a une-dryrun true
option qui vous permettra de savoir ce qu’il aurait fait. Remplacer les doublons par des liens en dur est aussi simple que-makehardlinks true
. Cela a produit un journal de bord agréable et il m’a permis de savoir combien d’espace a été libéré. De plus, selon l'auteur de référence , rdfind est plus rapide que duff et fslint.Utilisez l'
fdupes
outil:fdupes -r /path/to/folder
vous donne une liste des doublons dans le répertoire (-r le rend récursif). La sortie ressemble à ceci:nomfichier1
nomfichier2
nomfichier3
nomfichier4
nomfichier5
avec filename1 et filename2 identiques, et filename3, filename4 et filename5 étant identiques.
la source
rdfind
- commefdupes
, mais plus rapidement et disponible sous OS X et Cygwin.fdupes
semble ne trouver que des doublons, pas les remplacer par des liens durs, donc pas une réponse à la question IMO.jdupes
basé surfdupes
, mais il peut également remplacer les fichiers en double par symlinks (-l
), hardlinks (-L
) ou demander à btrfs de dédupliquer les blocs au niveau du système de fichiers (-B
, si vous utilisez btrfs).J'utilise
hardlink
depuis http://jak-linux.org/projects/hardlink/la source
hardlink
sur Fedora / RHEL / etc.hardlink
est maintenant un binaire natif dans de nombreux systèmes de packages Linux (depuis ~ 2014) et extrêmement rapide. Pour 1,2 millions de fichiers (320 Go), cela ne prenait que 200 secondes (environ 10% de la liaison des fichiers).hardlink
été créé par Julian Andres Klode alors que Fedora ahardlink
été créé par Jakub Jelinek (source: pagure.io/hardlink - nom du paquet Fedora: hardlink)C’est l’une des fonctions fournies par "fslint" - http://fr.flossmanuals.net/FSlint/Introduction
Cliquez sur le bouton "Fusionner":
la source
sudo apt-get install fslint
/usr/share/fslint/fslint/findup -m /your/directory/tree
(le répertoire / usr / share / fslint / fslint / n'est pas dans $ PATH par défaut)Puisque votre objectif principal est d'économiser de l'espace disque, il existe une autre solution: la déduplication (et probablement la compression) au niveau du système de fichiers. Par rapport à la solution à liaison fixe, le problème n’est pas d’affecter par inadvertance d’autres fichiers liés.
ZFS a déduplication (au niveau du bloc, pas au niveau du fichier) depuis la version 23 du pool et la compression depuis longtemps. Si vous utilisez linux, vous pouvez essayer zfs-fuse , ou si vous utilisez BSD, il est supporté de manière native.
la source
btrfs
utilise lot ou hors ligne Déduplication (exécuter chaque fois que vous le jugez utile / nécessaire) btrfs.wiki.kernel.org/index.php/Deduplicationrsync --inplace
uniquement les blocs modifiés stockés.De nos jours, sur Linux moderne, il existe https://github.com/g2p/bedup qui déduplique sur un système de fichiers btrfs, mais 1) sans autant de temps de numérisation, 2) les fichiers peuvent diverger facilement par la suite.
la source
cp --reflink
, voir également ci-dessous)Pour trouver les fichiers en double, vous pouvez utiliser duff .
Il suffit de lancer:
Pour créer automatiquement des liens durs vers ces fichiers, vous devez analyser la sortie de duff avec bash ou un autre langage de script.
la source
Description: Liens physiques multiples copies du même fichier Hardlink est un outil qui détecte plusieurs copies du même fichier et les remplace par des liens physiques.
L'idée a été empruntée à http://code.google.com/p/hardlinkpy/ , mais le code a été écrit à partir de rien et est sous licence MIT. Page d'accueil: http://jak-linux.org/projects/hardlink/
la source
J'ai utilisé de nombreux outils de création de liens durs pour Linux mentionnés ici. Moi aussi, je suis coincé avec ext4 fs, sur Ubuntu, et j'utilise ses cp -l et -s pour hard / softlinking. Mais récemment, nous avons remarqué une copie allégée dans la page de manuel de cp , ce qui impliquerait d’épargner l’espace disque redondant jusqu’à ce que l’ un des côtés soit modifié:
la source
cp
alias pour toujours inclure le--reflink=auto
paramètre maintenant--reflink
?Il me semble que vérifier le nom du fichier en premier pourrait accélérer les choses. Si deux fichiers n'ont pas le même nom de fichier, dans de nombreux cas, je ne les considérerais pas comme des doublons. Il semble que la méthode la plus rapide serait de comparer, dans l'ordre:
Est-ce que des méthodes font cela? Regardez
duff
,fdupes
,rmlint
,fslint
, etc.La méthode suivante a été la plus votée sur commandlinefu.com : Rechercher les fichiers en double (en fonction de la taille en premier, puis du hachage MD5)
La comparaison de nom de fichier peut-elle être ajoutée dans un premier temps, la taille dans un deuxième temps?
la source
duff
,fdupes
etrmlint
, et recommande fortement aux lecteurs de regarder le troisième d'entre eux . Il a un excellent ensemble d’options (et de documentation). Grâce à cela, j'ai pu éviter beaucoup de post-traitement que je devais utiliser avec les autres outils.install.sh
fichiers peuvent être trouvés sur un système actif? Je ne peux pas compter le nombre de fois que j'ai sauvegardé un fichier et que j'ai eu des conflits de noms, certains renommage à la volée permettant de l'enregistrer. Inverser le côté: je ne sais pas combien de fois j'ai téléchargé quelque chose de sources différentes, à des jours différents, seulement pour découvrir qu'il s'agit du même fichier avec des noms différents. (Ce qui tue également la fiabilité de l'horodatage.) 1: Taille, 2: Digest, 3: Contenu de l'octet.Puisque je ne suis pas un fan de Perl, voici une version bash:
Cela trouve tous les fichiers avec la même somme de contrôle (qu’ils soient gros, petits ou déjà en liens durs) et les lie ensemble.
Cela peut être grandement optimisé pour les exécutions répétées avec des indicateurs de recherche supplémentaires (par exemple, la taille) et un cache de fichiers (vous n'avez donc pas à refaire les sommes de contrôle à chaque fois). Si quelqu'un est intéressé par la version plus intelligente et plus longue, je peux la poster.
REMARQUE: Comme cela a été mentionné précédemment, les liens physiques fonctionnent tant que les fichiers n'ont jamais besoin d'être modifiés ou déplacés d'un système de fichiers à un autre.
la source
rdfind
que, qui fonctionnent à des vitesses natives et qui nécessitentbrew install rdfind
ou sont nécessairesapt-get install rdfind
pour être installées.J'ai créé un script Perl qui fait quelque chose de similaire à ce dont vous parlez:
http://pastebin.com/U7mFHZU7
Fondamentalement, il parcourt simplement un répertoire, en calculant la somme SHA1 des fichiers qu'il contient, en le hachant et en reliant les correspondances entre elles. Cela a été utile à maintes reprises.
la source
Si vous voulez remplacer les doublons par des liens en dur sur Mac ou tout système UNIX, vous pouvez essayer SmartDupe http://sourceforge.net/projects/smartdupe/ suis développer
la source
Les applications FSLint ( http://www.pixelbeat.org/fslint/ ) peuvent trouver tous les fichiers équivalents dans n’importe quel dossier (par contenu) et créer des liens physiques. Essaie!
Jorge Sampaio
la source
jdupes
a été mentionné dans un commentaire mais mérite sa propre réponse, car il est probablement disponible dans la plupart des distributions et tourne assez vite (il vient de libérer 2,7 Go d'une partition de 158% à 158% (lecteur SSD) en une minute environ):la source
Si vous faites des liens en dur, faites attention aux droits sur ce fichier. Avis, propriétaire, groupe, mode, attributs étendus, heure et ACL (si vous l'utilisez) est stocké dans INODE. Seuls les noms de fichiers sont différents car ils sont stockés dans une structure de répertoires et que d'autres pointent vers les propriétés INODE. Cette cause, tous les noms de fichiers liés au même inode ont les mêmes droits d'accès. Vous devez empêcher la modification de ce fichier, car tout utilisateur peut endommager le fichier. C'est simple. Il suffit que n'importe quel utilisateur mette un autre fichier sous le même nom. Le numéro d'inode est ensuite enregistré et le contenu du fichier d'origine est détruit (remplacé) pour tous les noms liés de manière permanente.
La meilleure façon est la déduplication sur la couche du système de fichiers. Vous pouvez utiliser BTRFS (très populaire la dernière fois), OCFS ou similaire. Regardez la page: https://en.wikipedia.org/wiki/Comparison_of_file_systems , plus particulièrement à la table Caractéristiques et déduplication des données de colonne. Vous pouvez cliquer dessus et trier :)
Regardez spécialement le système de fichiers ZFS. Ceci est disponible en tant que FUSE, mais de cette façon, il est très lent. Si vous souhaitez un support natif, consultez la page http://zfsonlinux.org/ . Ensuite, vous devez patcher le noyau, puis installer les outils zfs pour la gestion. Je ne comprends pas pourquoi Linux ne supporte pas les pilotes, mais bien d'autres systèmes d'exploitation / noyaux.
Les systèmes de fichiers prennent en charge la déduplication de deux manières, les fichiers dédoublonnés ou les blocs. ZFS prend en charge le blocage. Cela signifie que le même contenu qui se répète dans le même fichier peut être dédupliqué. Autrement, l'heure à laquelle les données sont dédupliquées peut être en ligne (zfs) ou hors ligne (btrfs).
Notez que la déduplication consomme de la RAM. C’est pourquoi l’écriture de fichiers sur un volume ZFS monté avec FUSE nuit considérablement aux performances. Ceci est décrit dans la documentation. Mais vous pouvez définir en ligne la déduplication activée / désactivée sur le volume. Si vous estimez que des données doivent être dédupliquées, vous devez simplement activer la déduplication, réécrire certains fichiers sur un fichier temporaire et enfin les remplacer. après cela, vous pouvez désactiver la déduplication et restaurer des performances optimales. Bien sûr, vous pouvez ajouter au stockage n’importe quel disque en cache. Cela peut être une rotation très rapide des disques ou des disques SSD. Bien sûr, cela peut être de très petits disques. En vrai travail, ceci remplace la RAM :)
Sous Linux, vous devez prendre soin de ZFS car tout ne fonctionne pas comme il se doit, spécialement lorsque vous gérez un système de fichiers, créez un instantané, etc., mais si vous effectuez une configuration sans le modifier, tout fonctionne correctement. Autrement, vous devriez changer linux en opensolaris, il supporte nativement ZFS :) Ce qui est bien avec ZFS, c’est que ça fonctionne à la fois en tant que système de fichiers et en tant que gestionnaire de volumen similaire à LVM. Vous n'en avez pas besoin lorsque vous utilisez ZFS. Voir la documentation si vous voulez en savoir plus.
Remarquez la différence entre ZFS et BTRFS. ZFS est plus ancien et plus mature, malheureusement uniquement sous Solaris et OpenSolaris (malheureusement étranglé par Oracle). BTRFS est plus jeune, mais la dernière fois, très bien pris en charge. Je recommande le noyau frais. ZFS a une déduplication en ligne, qui ralentit les écritures, car tout est calculé en ligne. BTRFS prend en charge la déduplication hors ligne. Cela économise ensuite les performances, mais lorsque l’hôte n’a plus rien à faire, vous exécutez régulièrement un outil pour effectuer la déduplication. Et BTRFS est créé nativement sous Linux. Peut-être que c'est mieux FS pour vous :)
la source
btrfs
. Excellente discussion sur les options (y compris l'cp --reflink
option) ici: btrfs.wiki.kernel.org/index.php/DeduplicationLes liens physiques ne sont peut-être pas la meilleure idée. si un utilisateur modifie le fichier, cela affecte les deux. Cependant, la suppression d'un lien physique ne supprime pas les deux fichiers. De plus, je ne suis pas tout à fait sûr que les liens physiques prennent la même quantité d’espace (sur le disque dur, pas le système d’exploitation) que plusieurs copies du même fichier; selon Windows (avec l'extension Link Shell), ils le font. Certes, c'est Windows, pas Unix ...
Ma solution serait de créer un fichier "commun" dans un dossier caché et de remplacer les doublons actuels par des liens symboliques ... les liens symboliques seraient alors incorporés à des métadonnées ou à des flux de fichiers alternatifs qui n'enregistrent que les deux "fichiers". sont différentes les unes des autres, comme si une personne voulait changer le nom de fichier ou ajouter une pochette d'album personnalisée ou quelque chose comme ça; cela peut même être utile en dehors des applications de base de données, comme avoir plusieurs versions du même jeu ou logiciel installé et les tester indépendamment avec les plus petites différences.
la source
Le moyen le plus simple est d'utiliser le programme spécial dupeGuru
comme dit la documentation
la source