Comment remplacer tous les fichiers en double par des liens durs?

20

J'ai deux dossiers contenant différents fichiers. Certains fichiers du premier dossier ont une copie exacte dans le deuxième dossier. Je voudrais remplacer ceux par un lien dur. Comment puis je faire ça?

qdii
la source
2
Veuillez fournir le système d'exploitation et le système de fichiers.
Steven
Eh bien, j'utilise ext4 sur Ubuntu 15.04, mais si quelqu'un fournit une réponse pour un autre système d'exploitation, je suis sûr que cela peut être utile pour quelqu'un qui lit cette question.
qdii
Voici une double question sur Unix.SE .
Alexey

Réponses:

20

Je connais 4 solutions en ligne de commande pour linux. Mon préféré est le dernier répertorié ici, rdfinden raison de toutes les options disponibles.

fdupes

  • Cela semble être le plus recommandé / le plus connu.
  • C'est la plus simple à utiliser, mais sa seule action est de supprimer les doublons.
  • Pour garantir que les doublons sont en fait des doublons (tout en ne prenant pas une éternité à s'exécuter), les comparaisons entre les fichiers se font d'abord par taille de fichier, puis par hachage md5, puis par comparaison octet par octet.

Exemple de sortie (avec les options "show size", "recursive"):

$ fdupes -Sr .
17 bytes each:                          
./Dir1/Some File
./Dir2/SomeFile

lien dur

  • Conçu pour, comme son nom l'indique, remplacer les fichiers trouvés par des liens physiques.
  • A une --dry-runoption.
  • N'indique pas comment le contenu est comparé, mais contrairement à toutes les autres options, prend en compte le mode de fichier, le propriétaire et l'heure modifiée.

Exemple de sortie (notez que mes deux fichiers ont des temps de modification légèrement différents, donc lors de la deuxième exécution, je lui dis d'ignorer cela):

$ stat Dir*/* | grep Modify
Modify: 2015-09-06 23:51:38.784637949 -0500
Modify: 2015-09-06 23:51:47.488638188 -0500

$ hardlink --dry-run -v .
Mode:     dry-run
Files:    5
Linked:   0 files
Compared: 0 files
Saved:    0 bytes
Duration: 0.00 seconds

$ hardlink --dry-run -v -t .
[DryRun] Linking ./Dir2/SomeFile to ./Dir1/Some File (-17 bytes)
Mode:     dry-run
Files:    5
Linked:   1 files
Compared: 1 files
Saved:    17 bytes
Duration: 0.00 seconds

duff

  • Conçu pour rechercher des fichiers sur lesquels l'utilisateur agit ensuite; n'a aucune action disponible.
  • Les comparaisons se font par taille de fichier, puis par hachage sha1.
    • Le hachage peut être changé en sha256, sha384 ou sha512.
    • Le hachage peut être désactivé pour effectuer une comparaison octet par octet

Exemple de sortie (avec option "récursif"):

$ duff -r .
2 files in cluster 1 (17 bytes, digest 34e744e5268c613316756c679143890df3675cbb)
./Dir2/SomeFile
./Dir1/Some File

rdfind

  • Les options ont une syntaxe inhabituelle (destinée à imiter find?).
  • Plusieurs options d'actions à entreprendre sur les fichiers en double (supprimer, créer des liens symboliques, créer des liens physiques).
  • A un mode de marche à sec.
  • Les comparaisons sont effectuées par taille de fichier, puis premier octet, puis dernier octet, puis md5 (par défaut) ou sha1.
  • Le classement des fichiers trouvés permet de prévoir quel fichier est considéré comme l'original.

Exemple de sortie:

$ rdfind -dryrun true -makehardlinks true .
(DRYRUN MODE) Now scanning ".", found 5 files.
(DRYRUN MODE) Now have 5 files in total.
(DRYRUN MODE) Removed 0 files due to nonunique device and inode.
(DRYRUN MODE) Now removing files with zero size from list...removed 0 files
(DRYRUN MODE) Total size is 13341 bytes or 13 kib
(DRYRUN MODE) Now sorting on size:removed 3 files due to unique sizes from list.2 files left.
(DRYRUN MODE) Now eliminating candidates based on first bytes:removed 0 files from list.2 files left.
(DRYRUN MODE) Now eliminating candidates based on last bytes:removed 0 files from list.2 files left.
(DRYRUN MODE) Now eliminating candidates based on md5 checksum:removed 0 files from list.2 files left.
(DRYRUN MODE) It seems like you have 2 files that are not unique
(DRYRUN MODE) Totally, 17 b can be reduced.
(DRYRUN MODE) Now making results file results.txt
(DRYRUN MODE) Now making hard links.
hardlink ./Dir1/Some File to ./Dir2/SomeFile
Making 1 links.

$ cat results.txt 
# Automatically generated
# duptype id depth size device inode priority name
DUPTYPE_FIRST_OCCURRENCE 1 1 17 2055 24916405 1 ./Dir2/SomeFile
DUPTYPE_WITHIN_SAME_TREE -1 1 17 2055 24916406 1 ./Dir1/Some File
# end of file
Izkata
la source
1
"puis soit md5 (par défaut) ou sha1." Cela ne signifie pas que les fichiers sont identiques. Étant donné que le calcul d'un hachage nécessite de toute façon que le programme lise le fichier entier, il doit simplement comparer les fichiers entiers octet par octet. Économise également du temps CPU.
endolith
@endolith C'est pourquoi vous commencez toujours par un essai à sec, pour voir ce qui se passerait ...
Izkata
1
Mais le but du logiciel est d'identifier les fichiers en double pour vous. Si vous devez vérifier manuellement que les fichiers sont bien des doublons, ce n'est pas bon.
endolith
2
Si vous avez n fichiers de taille identique, de premier octet et de fin octet, mais qu'ils sont tous autrement différents, déterminer que par comparaison directe nécessite n ! comparaisons de paires. Les hacher tous puis comparer les hachages sera probablement beaucoup plus rapide, en particulier pour les gros fichiers et / ou un grand nombre de fichiers. Tous ceux qui passent ce filtre peuvent continuer à faire des comparaisons directes pour vérifier. (Ou utilisez simplement un meilleur hachage pour commencer.)
Alan De Smet
6

Duplicate Commander est une solution possible sous Windows:

Duplicate Commander est une application gratuite qui vous permet de rechercher et de gérer des fichiers en double sur votre PC. Duplicate Commander est livré avec de nombreuses fonctionnalités et outils qui vous permettent de récupérer votre espace disque à partir de ces doublons.

Fonctionnalités:

Replacing files with hard links
Replacing files with soft links
... (and many more) ...

1

Pour Linux, vous pouvez trouver un script Bash ici .

Karan
la source
2

Duplicate & Same File Searcher est encore une autre solution sur Windows:

Duplicate & Same Files Searcher (Duplicate Searcher) est une application pour rechercher des fichiers en double (clones) et des liens durs NTFS vers le même fichier. Il recherche le contenu des fichiers en double quel que soit le nom du fichier (une véritable comparaison octet à octet est utilisée). Cette application permet non seulement de supprimer les fichiers en double ou de les déplacer vers un autre emplacement, mais également de remplacer les doublons par des liens durs NTFS (unique!)

entrez la description de l'image ici

Greck
la source
1

J'avais un outil gratuit astucieux sur mon ordinateur appelé Link Shell Extension; non seulement c'était génial pour créer des liens physiques et des liens symboliques, mais aussi des jonctions! De plus, il a ajouté des icônes personnalisées qui vous permettent d'identifier facilement différents types de liens, même ceux qui existaient déjà avant l'installation; Les flèches rouges représentent les liens durs par exemple, tandis que le vert représente les liens symboliques ... et les chaînes représentent les jonctions.

J'ai malheureusement désinstallé le logiciel il y a quelque temps (lors d'une désinstallation en masse de divers programmes), donc je ne peux plus créer de liens manuellement, mais les icônes apparaissent toujours automatiquement chaque fois que Windows détecte un lien dur, symbolique ou de jonction.

Amaroq Starwind
la source
1

Je recommande fortement jdupes . Il s'agit d'une fourchette améliorée de fdupes , mais comprend également:

  • un tas de nouvelles options de ligne de commande - y compris --linkhard, ou -Lpour faire court
  • prise en charge native de toutes les principales plates-formes de système d'exploitation
  • la vitesse serait 7 fois plus rapide que les fdupes en moyenne

Pour votre question, vous pouvez simplement exécuter $ jdupes -L /path/to/your/files.

Vous voudrez peut-être cloner et créer la dernière source à partir de son référentiel GitHub car le projet est toujours en cours de développement. Les binaires Windows sont également fournis ici. Des binaires packagés sont disponibles dans certaines distributions Linux / BSD - en fait, je l'ai trouvé pour la première fois $ apt search.

Arnie97
la source