Récemment, j'ai dû supprimer un grand nombre de doublons. Je fusionne trois ou quatre systèmes de fichiers et je souhaite que l'espace soit utilisé de manière économique. Au début, cela fdupes
semblait être le meilleur outil pour le travail, mais je rencontre de plus en plus de limites.
Considérez la commande fdupes -rdN somedirectory/
. Cela crée un hachage de tous les fichiers dans les sous-répertoires de certains répertoires.
Et quand il rencontre des doublons, il les supprime, de sorte qu'il n'y a qu'une seule copie de tout.
Mais que se passe-t-il si je veux conserver somedirectory/subdirectory1/somefile
et qu'il y a, en fait, quatre doublons, et que le programme rencontre d'abord l'un des doublons? Ensuite, il supprime somedirectory/subdirectory1/somefile
ce que je ne veux pas.
Je veux pouvoir spécifier, en quelque sorte, les doublons à conserver. Et jusqu'à présent, aucun des programmes standard pour gérer les doublons (duff, FSLint) ne semble permettre l'automatisation de ce type de comportement. Je préfère ne pas lancer la mienne, c'est pourquoi je pose cette question.
J'aimerais pouvoir écrire quelque chose comme
killdupes -rdN --keep=filesin,somedirectories,separated,by,commas somedirectory/
la source
Réponses:
Bien que la fonctionnalité que vous recherchez n'est pas disponible en stock
fdupes
, j'ai bifurquéfdupes
(ma fourchette s'appellejdupes
) et j'ai ajouté quelques fonctionnalités qui peuvent résoudre ce problème dans certaines circonstances. Par exemple, dans le cas indiqué où vous souhaitez conserversomedirectory/subdirectory1/somefile
lors de la suppression automatique des doublons (les commutateursd
etN
ensemble) et où il n'y a pas de fichiers séparés immédiatement en dessoussomedirectory
, vousjdupes
pouvez alimenter chaque chemin de sous-répertoire immédiat avecsubdirectory1
first et le-O
commutateur (qui trie les fichiers par commande -Ordre des paramètres de ligne en premier):jdupes -nrdNO somedirectory/subdirectory1 somedirectory/subdirectory2 somedirectory/subdirectory3
Cela supprimera automatiquement tous les fichiers sauf un dans un jeu en double et garantira que si le jeu contient un fichier,
somedirectory/subdirectory1
il sera le premier, devenant ainsi automatiquement le fichier préservé dans le jeu. Il y a encore des limites flagrantes à cette approche, comme le fait qu'un autre doublonsomedirectory/subdirectory1
puisse être conservé au lieu de celui que vous vouliez conserver, mais dans un bon nombre de cas comme le vôtre, l'jdupes
option d'ordre des paramètres comme solution de contournement est assez bonne.Dans un avenir proche, je prévois d'ajouter un système de filtrage
jdupes
qui permettra un énorme contrôle de l'inclusion / exclusion des fichiers, de la conservation des-N
actions et de l'application de ces "piles de filtres" sur une base globale ou par paramètre. Cette fonctionnalité est absolument nécessaire; J'envisage quelque chose comme ceci pour "supprimer automatiquement les doublons non nuls de manière récursive MAIS toujours conserversomedirectory/subdirectory1/somefile
tels quels ":jdupes -nrdN --filter=preserve:somedirectory/subdirectory1/somefile somedirectory/
la source
Qu'en est-il de l'association des fichiers en double? De cette façon, l'espace n'est utilisé qu'une seule fois, mais ils existent toujours dans tous les chemins. Le hic avec ceci est que les fichiers liés en dur doivent être modifiés sur place (ils ne doivent être modifiés qu'en supprimant le fichier et en le recréant avec le nouveau contenu). L'autre approche consiste à créer un lien symbolique entre les fichiers, bien que vous ayez le même problème de décider quel est le fichier "principal". Cela pourrait être fait avec le script suivant (bien que notez que cela ne gère pas les noms de fichiers contenant des espaces).
la source
jdupes
place defdupes
vous peut simplement aller,jdupes -nrL somedirectory/
ce qui est massivement plus rapide.Je n'ai vu celui-ci nulle part ailleurs: dites ce que vous voulez, c'est ceci. Vous avez / mnt / folder-tree-1 / mnt / folder-tree-2. Vous ne voulez pas supprimer chaque dupe, mais si un fichier existe dans l'arborescence-2 et qu'un fichier identique existe dans l'arborescence-1 avec le même chemin d'accès et le même nom, supprimez-le de l'arborescence-2.
Attention: c'est assez laconique et si vous essayez de copier-coller avec des compétences limitées en shell, soyez prudent.
Ou tout sur une seule ligne:
Ensuite, inspectez et exécutez rm-v2-dupes.sh
la source
J'avais la même question. Si vous avez plusieurs doublons
fdupes /my/directory/ -rdN
conserve le fichier avec la date de modification la plus ancienne, ou si plusieurs fichiers ont la même date de modification, alors celui trouvé en premier.Si la date de modification n'est pas importante pour vous, vous pouvez
touch
les fichiers dans le répertoire que vous souhaitez conserver. Si vous les choisisseztouch
avec la date et l'heure actuelles, vousfdupes -rdNi
conserverez ceux avec la date actuelle. Vous pouvez égalementtouch
conserver les fichiers dont la date est antérieure à celle que vous souhaitez supprimer et utiliserfdupes -rdN
normalement.Si vous devez conserver la date de modification, vous devrez utiliser l'une des autres méthodes.
la source
Juste pour ajouter une touche à une réponse précédente. J'ai utilisé le code suivant plusieurs fois, modifiant légèrement une réponse précédente avec un simple
| grep
pour isoler le dossier dont je veux supprimer.Encore une fois, cela créera un fichier sh pour supprimer tous les fichiers répertoriés, aucune ligne commentée. Bien sûr, vous pouvez toujours modifier le fichier pour commenter les lignes / fichiers spécifiques que vous souhaitez conserver.
Une autre astuce pour les grands répertoires est d'exécuter fdupes dans un fichier txt, puis d'expérimenter avec
| grep
et| sed
jusqu'à ce que j'obtienne le résultat souhaité.la source
Utilisez
sed
pour créer un fichier shell qui contiendra des commandes commentées pour supprimer chacun de vos fichiers en double:Le
remove-duplicate-files.sh
fichier résultant que nous venons de créer mettra en commentaire chaque ligne. Décommentez les fichiers que vous souhaitez supprimer. Ensuite, courezsh remove-duplicate-files.sh
. Voila!MISE À JOUR
Eh bien, si vous ne souhaitez pas supprimer des fichiers uniquement dans certains répertoires, c'est aussi simple que cela :
Où
exclude_duplicates.py
est:Le
remove-duplicate-files-keep-protected.sh
fichier résultant que nous venons de créer contiendra tous les fichiers des répertoires protégés. Ouvrez ce fichier dans votre éditeur de texte préféré, vérifiez que tout est OK. Ensuite, lancez-le. Voila (sic)!la source
Et quelque chose comme ça?
la source