Znajdź wszystkie foldery w katalogu o tej samej zawartości

10

Czy w Ubuntu można znaleźć zduplikowane foldery w katalogu (tj. Foldery o tej samej zawartości)? Myślę, że są już dostępne narzędzia wiersza polecenia do znajdowania duplikatów plików (takie jak fdupes), ale zamiast tego chcę znaleźć duplikaty folderów. Oznacza to, że znajdź foldery, które pasują pod względem zawartości zawartych w nich plików (chociaż nazwy plików i inne metadane mogą się różnić).

Anderson Green
źródło
Mogę zacząć od wygenerowania listy wszystkich folderów w katalogu (posortowanych według długości), a następnie sprawdzenia każdej pary folderów o tej samej długości.
Anderson Green,
Zdefiniuj „duplikat”. Czy pliki w środku muszą pasować tylko do zawartości pliku? Nazwa pliku? Numer węzła? Rozmiar pliku?
Chris Down
@ChrisDown Pytanie zostało zaktualizowane.
Anderson Green,
3
Tak. Katalogi to tak naprawdę tylko pliki, więc twoje stwierdzenie jest dwuznaczne. Posiadanie „tej samej treści” w rzeczywistości oznaczałoby, że oba katalogi zawierają te same odwołania do i-węzłów. Nie jest jasne, czy masz na myśli to, czy masz na myśli, że pliki w środku powinny mieć tę samą treść, a jeśli tak, to czy istnieją inne warunki (mtime, nazwa pliku itp.).
Chris Down
3
@ChrisDown Mam na myśli, że pliki w środku powinny mieć tę samą zawartość.
Anderson Green,

Odpowiedzi:

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"

Możesz zobaczyć to w akcji tutaj:

$ 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
źródło
Ponieważ ten skrypt nie został przetestowany, chętnie sprawdzam, czy działa tak, jak powinien.
Anderson Green,
1
@AndersonGreen Sprawdź zaktualizowaną odpowiedź, przetestowałem ją.
Chris Down
Miły! Powinien również zostać przeprowadzony test z cat > 1/2 <<< bari w cat > 2/3 <<< bar celu wyświetlenia wielu plików i różnych metadanych (== "Same")
nealmcb
@ChrisDown: czy sortowanie wymaga ostatniego kroku?
harish.venkat
Elegancki skrypt, tylko niewielki błąd polega na tym, że zwraca ten sam, gdy jeden lub oba katalogi nie istnieją. Powinien być łatwy do naprawienia, jeśli ktoś jest lepszy w skryptach niż I.
cosinus