Có thể tìm thấy các tệp trùng lặp trên đĩa của tôi giống hệt nhau từ bit đến bit nhưng có tên tệp khác nhau không?
st_size
s phù hợp , loại bỏ những cái chỉ có một cái giống nhau và sau đó chỉ tính md5sums cho st_size
s phù hợp .
Có thể tìm thấy các tệp trùng lặp trên đĩa của tôi giống hệt nhau từ bit đến bit nhưng có tên tệp khác nhau không?
st_size
s phù hợp , loại bỏ những cái chỉ có một cái giống nhau và sau đó chỉ tính md5sums cho st_size
s phù hợp .
Câu trả lời:
fdupes
có thể làm điều này Từ man fdupes
:
Tìm kiếm đường dẫn đã cho cho các tệp trùng lặp. Các tệp như vậy được tìm thấy bằng cách so sánh kích thước tệp và chữ ký MD5, theo sau là so sánh theo từng byte.
Trong Debian hoặc Ubuntu, bạn có thể cài đặt nó với apt-get install fdupes
. Trong Fedora / Red Hat / CentOS, bạn có thể cài đặt nó với yum install fdupes
. Trên Arch Linux, bạn có thể sử dụng pacman -S fdupes
và trên Gentoo , emerge fdupes
.
Để chạy một kiểm tra giảm dần từ gốc hệ thống tập tin của bạn, việc này có thể sẽ tốn một lượng thời gian và bộ nhớ đáng kể, hãy sử dụng một cái gì đó như fdupes -r /
.
Khi được hỏi trong các ý kiến, bạn có thể nhận được các bản sao lớn nhất bằng cách thực hiện như sau:
fdupes -r . | {
while IFS= read -r file; do
[[ $file ]] && du "$file"
done
} | sort -n
Điều này sẽ phá vỡ nếu tên tệp của bạn chứa dòng mới.
fdupes ....... | xargs ls -alhd | egrep 'M |G '
để giữ các tập tin ở định dạng có thể đọc được con người và chỉ những người có kích thước trong MB hoặc Gigabyte. Thay đổi lệnh cho phù hợp với đầu ra thực.
du
đường ống sort
sẽ cho bạn biết.
Một công cụ tốt khác là fslint
:
fslint là một bộ công cụ để tìm các vấn đề khác nhau với các hệ thống tệp, bao gồm các tệp trùng lặp và tên tệp có vấn đề, v.v.
Các công cụ dòng lệnh riêng lẻ có sẵn ngoài GUI và để truy cập chúng, người ta có thể thay đổi hoặc thêm vào $ PATH thư mục / usr / share / fslint / fslint trên bản cài đặt tiêu chuẩn. Mỗi lệnh trong thư mục đó có tùy chọn --help để biết thêm chi tiết về các tham số của nó.
findup - find DUPlicate files
Trên các hệ thống dựa trên debian, bạn có thể cài đặt nó với:
sudo apt-get install fslint
Bạn cũng có thể làm điều này bằng tay nếu bạn không muốn hoặc không thể cài đặt các công cụ của bên thứ ba. Cách thức hoạt động của hầu hết các chương trình như vậy là bằng cách tính toán tổng kiểm tra tệp . Các tệp có cùng md5sum gần như chắc chắn chứa chính xác cùng một dữ liệu. Vì vậy, bạn có thể làm một cái gì đó như thế này:
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
Đầu ra mẫu (tên tệp trong ví dụ này giống nhau, nhưng nó cũng sẽ hoạt động khi chúng khác nhau):
$ 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
---
Đây sẽ là nhiều chậm hơn so với các công cụ chuyên dụng đã được đề cập, nhưng nó sẽ làm việc.
st_size
, loại bỏ bất kỳ tệp nào chỉ có một tệp có kích thước này và sau đó chỉ tính toán md5sums giữa các tệp có cùng st_size
.
Câu trả lời ngắn gọn: có.
Phiên bản dài hơn: hãy xem mục nhập wikipedia fdupes , nó có một danh sách khá tốt về các giải pháp đã sẵn sàng. Tất nhiên bạn có thể viết riêng của bạn, nó không phải là khó khăn - chương trình băm như diff
, sha*sum
, find
, sort
và uniq
nên thực hiện công việc. Bạn thậm chí có thể đặt nó trên một dòng, và nó vẫn sẽ dễ hiểu.
Nếu bạn tin rằng hàm băm (ở đây MD5) không va chạm trên miền của bạn:
find $target -type f -exec md5sum '{}' + | sort | uniq --all-repeated --check-chars=32 \
| cut --characters=35-
Muốn tên tập tin giống hệt nhau được nhóm? Viết một kịch bản đơn giản not_uniq.sh
để định dạng đầu ra:
#!/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
Sau đó thay đổi find
lệnh để sử dụng tập lệnh của bạn:
chmod +x not_uniq.sh
find $target -type f -exec md5sum '{}' + | sort | not_uniq.sh
Đây là ý tưởng cơ bản. Có lẽ bạn nên thay đổi find
nếu tên tệp của bạn có chứa một số ký tự. (ví dụ: không gian)
Tôi nghĩ sẽ thêm một nhánh fdupes, jdupes được cải tiến gần đây , hứa hẹn sẽ nhanh hơn và nhiều tính năng hơn fdupes (ví dụ: bộ lọc kích thước):
jdupes . -rS -X size-:50m > myjdups.txt
Điều này sẽ đệ quy tìm các tệp trùng lặp lớn hơn 50MB trong thư mục hiện tại và xuất danh sách kết quả trong myjdups.txt.
Lưu ý, đầu ra không được sắp xếp theo kích thước và vì nó dường như không được xây dựng, tôi đã điều chỉnh câu trả lời @Chris_Down ở trên để đạt được điều này:
jdupes -r . -X size-:50m | {
while IFS= read -r file; do
[[ $file ]] && du "$file"
done
} | sort -n > myjdups_sorted.txt
Wikipedia đã có một bài viết ( http://en.wikipedia.org/wiki/List_of_d repeatate_file_finder ), với một danh sách các phần mềm nguồn mở có sẵn cho nhiệm vụ này, nhưng hiện tại nó đã bị xóa .
Tôi sẽ thêm rằng phiên bản GUI của fslint rất thú vị, cho phép sử dụng mặt nạ để chọn tệp nào cần xóa. Rất hữu ích để làm sạch hình ảnh trùng lặp.
Trên Linux, bạn có thể sử dụng:
- FSLint: http://www.pixelbeat.org/fslint/
- FDupes: https://en.wikipedia.org/wiki/Fdupes
- DupeGuru: https://www.hardcoded.net/dupeguru/
Hai công việc cuối cùng trên nhiều hệ thống (windows, mac và linux) Tôi chưa kiểm tra FSLint
Đây là của tôi về điều đó:
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
Điều khác biệt ở chỗ nó chỉ băm tối đa 1 MB đầu tiên của tệp.
Điều này có một số vấn đề / tính năng:
Tôi sử dụng nó để so sánh các video clip vì vậy điều này là đủ cho tôi.