Trouver tous les dossiers d'un répertoire avec le même contenu

10

Dans Ubuntu, y en a-t-il pour trouver des dossiers en double dans un répertoire (c'est-à-dire des dossiers avec le même contenu)? Je pense qu'il existe déjà des outils de ligne de commande disponibles pour trouver des fichiers en double (tels que fdupes), mais je veux plutôt trouver des dossiers en double. Autrement dit, recherchez les dossiers qui correspondent en termes de contenu des fichiers qu'ils contiennent (bien que les noms de fichiers et autres métadonnées puissent différer).

Anderson Green
la source
Je pourrais commencer par générer une liste de tous les dossiers d'un répertoire (triés par longueur), puis vérifier chaque paire de dossiers de la même longueur.
Anderson Green
Définissez "dupliquer". Les fichiers à l'intérieur doivent-ils correspondre simplement au contenu du fichier? Nom de fichier? Numéro d'inode? Taille du fichier?
Chris Down
@ChrisDown La question a été mise à jour.
Anderson Green
3
Oui. Les répertoires ne sont en réalité que des fichiers, votre déclaration est donc ambiguë. Avoir le "même contenu" en réalité signifierait que les répertoires contiennent tous les deux les mêmes références d'inode. Il n'est pas clair si vous voulez dire cela, ou si vous voulez dire que les fichiers à l'intérieur doivent avoir le même contenu, et si oui, s'il y a d'autres stipulations (mtime, nom de fichier, etc.).
Chris Down
3
@ChrisDown Je veux dire que les fichiers à l'intérieur devraient avoir le même contenu.
Anderson Green

Réponses:

5
#!/bin/bash
shopt -s dotglob

for file in "$1"/*; do [[ -f "$file" ]] && d1+=( "$(md5sum < "$file")" ); done
for file in "$2"/*; do [[ -f "$file" ]] && d2+=( "$(md5sum < "$file")" ); done 

[[ "$(sort <<< "${d1[*]}")" == "$(sort <<< "${d2[*]}")" ]] && echo "Same" || echo "Different"

Vous pouvez le voir en action ici:

$ mkdir 1 2
$ ./comparedirs 1 2
Same
$ cat > 1/1 <<< foo
$ cat > 2/1 <<< foo
$ ./comparedirs 1 2
Same
$ cat > 2/1 <<< bar
$ ./comparedirs 1 2
Different
Chris Down
la source
Puisque ce script n'a pas été testé, j'ai hâte de voir s'il fonctionne comme il est censé fonctionner.
Anderson Green
1
@AndersonGreen Vérifiez la réponse mise à jour, testez-la.
Chris Down
Agréable! Il devrait également y avoir un test avec cat > 1/2 <<< baret cat > 2/3 <<< bar pour afficher plusieurs fichiers et différentes métadonnées (== "Identique")
nealmcb
@ChrisDown: faut-il trier à la dernière étape?
harish.venkat
Script élégant, seul bogue mineur est qu'il renvoie la même chose lorsque l'un des répertoires ou les deux n'existent pas. Devrait être facilement réparable si l'on est meilleur en script que moi
cosinus