Czy na moim dysku można znaleźć duplikaty plików, które są identyczne bit po bicie, ale mają różne nazwy plików?
st_size
s, eliminując te, które mają tylko jedno takie same, a następnie obliczając tylko sumy md5 dla pasujących st_size
s.
Czy na moim dysku można znaleźć duplikaty plików, które są identyczne bit po bicie, ale mają różne nazwy plików?
st_size
s, eliminując te, które mają tylko jedno takie same, a następnie obliczając tylko sumy md5 dla pasujących st_size
s.
Odpowiedzi:
fdupes
mogę to zrobić. Od man fdupes
:
Przeszukuje podaną ścieżkę w poszukiwaniu duplikatów plików. Takie pliki można znaleźć, porównując rozmiary plików i sygnatury MD5, a następnie porównując bajt po bajcie.
W Debianie lub Ubuntu możesz go zainstalować przy pomocy apt-get install fdupes
. W Fedorze / Red Hat / CentOS możesz go zainstalować za pomocą yum install fdupes
. Na Arch Linux można użyć pacman -S fdupes
, a na Gentoo emerge fdupes
.
Aby uruchomić czek malejący z katalogu głównego systemu plików, co prawdopodobnie zajmie dużo czasu i pamięci, użyj czegoś takiego fdupes -r /
.
Jak podano w komentarzach, możesz uzyskać największe duplikaty, wykonując następujące czynności:
fdupes -r . | {
while IFS= read -r file; do
[[ $file ]] && du "$file"
done
} | sort -n
To się zepsuje, jeśli twoje nazwy plików zawierają nowe linie.
fdupes ....... | xargs ls -alhd | egrep 'M |G '
aby zachować pliki w formacie czytelnym dla ludzi i tylko te o rozmiarze w megabajtach lub gigabajtach. Zmień polecenie, aby odpowiadało rzeczywistym wynikom.
du
potok do sort
powie ci.
Kolejnym dobrym narzędziem jest fslint
:
fslint to zestaw narzędzi do znajdowania różnych problemów z systemami plików, w tym duplikatów plików i problematycznych nazw plików itp.
Poszczególne narzędzia wiersza poleceń są dostępne oprócz GUI i aby uzyskać do nich dostęp, można zmienić lub dodać do $ PATH katalog / usr / share / fslint / fslint podczas standardowej instalacji. Każde z tych poleceń w tym katalogu ma opcję --help, która bardziej szczegółowo opisuje jego parametry.
findup - find DUPlicate files
W systemach opartych na Debianie możesz zainstalować go z:
sudo apt-get install fslint
Możesz to zrobić ręcznie, jeśli nie chcesz lub nie możesz zainstalować narzędzi innych firm. Większość takich programów działa poprzez obliczanie sum kontrolnych plików . Pliki z tym samym md5sum prawie na pewno zawierają dokładnie te same dane. Więc możesz zrobić coś takiego:
find / -type f -exec md5sum {} \; > md5sums
gawk '{print $1}' md5sums | sort | uniq -d > dupes
while read d; do echo "---"; grep $d md5sums | cut -d ' ' -f 2-; done < dupes
Przykładowe dane wyjściowe (nazwy plików w tym przykładzie są takie same, ale zadziała również, gdy będą różne):
$ while read d; do echo "---"; grep $d md5sums | cut -d ' ' -f 2-; done < dupes
---
/usr/src/linux-headers-3.2.0-3-common/include/linux/if_bonding.h
/usr/src/linux-headers-3.2.0-4-common/include/linux/if_bonding.h
---
/usr/src/linux-headers-3.2.0-3-common/include/linux/route.h
/usr/src/linux-headers-3.2.0-4-common/include/linux/route.h
---
/usr/src/linux-headers-3.2.0-3-common/include/drm/Kbuild
/usr/src/linux-headers-3.2.0-4-common/include/drm/Kbuild
---
Będzie to znacznie wolniejsze niż wspomniane już dedykowane narzędzia, ale zadziała.
st_size
, eliminując te, które mają tylko jeden plik o tym rozmiarze, a następnie obliczając sumy md5 tylko między plikami o tym samym rozmiarze st_size
.
Krótka odpowiedź: tak.
Dłuższa wersja: spójrz na wpis w Wikipedii fdupes , zawiera całkiem niezłą listę gotowych rozwiązań. Oczywiście można napisać własną rękę, nie jest to , że trudno - programy mieszaja jak diff
, sha*sum
, find
, sort
i uniq
powinno załatwić sprawę. Możesz nawet umieścić go w jednym wierszu i nadal będzie to zrozumiałe.
Jeśli uważasz, że funkcja skrótu (tutaj MD5) jest wolna od kolizji w Twojej domenie:
find $target -type f -exec md5sum '{}' + | sort | uniq --all-repeated --check-chars=32 \
| cut --characters=35-
Chcesz pogrupować identyczne nazwy plików? Napisz prosty skrypt, not_uniq.sh
aby sformatować dane wyjściowe:
#!/bin/bash
last_checksum=0
while read line; do
checksum=${line:0:32}
filename=${line:34}
if [ $checksum == $last_checksum ]; then
if [ ${last_filename:-0} != '0' ]; then
echo $last_filename
unset last_filename
fi
echo $filename
else
if [ ${last_filename:-0} == '0' ]; then
echo "======="
fi
last_filename=$filename
fi
last_checksum=$checksum
done
Następnie zmień find
polecenie, aby użyć skryptu:
chmod +x not_uniq.sh
find $target -type f -exec md5sum '{}' + | sort | not_uniq.sh
To jest podstawowy pomysł. Prawdopodobnie powinieneś zmienić, find
jeśli twoje nazwy plików zawierają niektóre znaki. (np. spacja)
Pomyślałem, aby dodać niedawno ulepszony rozwidlenie fdupes, jdupes , które zapowiadają się szybciej i będą bardziej bogate w funkcje niż fdupes (np. Filtr rozmiaru):
jdupes . -rS -X size-:50m > myjdups.txt
Spowoduje to rekurencyjne odnalezienie zduplikowanych plików większych niż 50 MB w bieżącym katalogu i wygenerowanie listy wyników w myjdups.txt.
Uwaga: dane wyjściowe nie są sortowane według rozmiaru, a ponieważ wydaje się, że nie są wbudowane, dostosowałem odpowiedź @Chris_Down powyżej, aby to osiągnąć:
jdupes -r . -X size-:50m | {
while IFS= read -r file; do
[[ $file ]] && du "$file"
done
} | sort -n > myjdups_sorted.txt
Wikipedia miała artykuł ( http://en.wikipedia.org/wiki/List_of_duplicate_file_finders ) z listą dostępnego oprogramowania typu open source do tego zadania, ale teraz zostało usunięte .
Dodam, że wersja fslint w GUI jest bardzo interesująca, pozwalając na użycie maski do wyboru plików do usunięcia. Bardzo przydatne do czyszczenia zduplikowanych zdjęć.
W systemie Linux możesz użyć:
- FSLint: http://www.pixelbeat.org/fslint/
- FDupes: https://en.wikipedia.org/wiki/Fdupes
- DupeGuru: https://www.hardcoded.net/dupeguru/
2 ostatnie prace na wielu systemach (Windows, Mac i Linux) Nie sprawdziłem FSLint
Oto moje zdanie na ten temat:
find -type f -size +3M -print0 | while IFS= read -r -d '' i; do
echo -n '.'
if grep -q "$i" md5-partial.txt; then echo -e "\n$i ---- Already counted, skipping."; continue; fi
MD5=`dd bs=1M count=1 if="$i" status=noxfer | md5sum`
MD5=`echo $MD5 | cut -d' ' -f1`
if grep "$MD5" md5-partial.txt; then echo "\n$i ---- Possible duplicate"; fi
echo $MD5 $i >> md5-partial.txt
done
Różni się tym, że zawiera tylko pierwsze 1 MB pliku.
Ma to kilka problemów / funkcji:
Używam go do porównywania klipów wideo, więc to mi wystarcza.