Giải pháp có thể bạn có thể sử dụng bất kỳ công cụ nào để chuyển đổi tệp thành luồng không nén ( pcm
, wav
) mà không có thông tin siêu dữ liệu và sau đó so sánh nó. Để chuyển đổi, bạn có thể sử dụng bất kỳ phần mềm nào bạn muốn ffmpeg
, sox
hoặc avidemux
.
Ví dụ: làm thế nào tôi làm điều đó với ffmpeg
Giả sử tôi có ví dụ về 2 tệp có siêu dữ liệu khác nhau:
$ diff Original.mp3 Possible-dup.mp3 ; echo $?
Binary files Original.mp3 and Possible-dup.mp3 differ
Brute so sánh lực lượng phàn nàn chúng khác nhau.
Sau đó, chúng tôi chỉ cần chuyển đổi và khác biệt cơ thể:
$ diff <( ffmpeg -loglevel 8 -i Original.mp3 -map_metadata -1 -f wav - ) <( ffmpeg -loglevel 8 -i Possible-dup.mp3 -map_metadata -1 -f wav - ) ; echo $?
0
Phần khóa học ; echo $?
chỉ dành cho mục đích trình diễn để xem mã trả về.
Xử lý nhiều tệp (thư mục đi qua)
Nếu bạn muốn thử bản sao trong bộ sưu tập nó có giá trị để tính toán tổng kiểm tra (bất kỳ như crc
, md5
, sha2
, sha256
) của dữ liệu và sau đó chỉ cần tìm thấy ở đó va chạm.
Mặc dù nó nằm ngoài phạm vi của câu hỏi đó, tôi sẽ đề xuất một số gợi ý đơn giản về cách tìm các bản sao của các tệp trong thư mục chỉ có nội dung mà không cần xem xét siêu dữ liệu.
- Đầu tiên tính toán băm dữ liệu trong mỗi tệp (và đặt vào tệp để xử lý tiếp theo):
for file in *.mp3; do printf "%s:%s\n" "$( ffmpeg -loglevel 8 -i "$file" -map_metadata -1 -f wav - | sha256sum | cut -d' ' -f1 )" "$file"; done > mp3data.hashes
Tệp sẽ giống như:
$ cat mp3data.hashes
ad48913a11de29ad4639253f2f06d8480b73d48a5f1d0aaa24271c0ba3998d02:file1.mp3
54320b708cea0771a8cf71fac24196a070836376dd83eedd619f247c2ece7480:file2.mp3
1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Original.mp3
8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other-dup.mp3
8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other.mp3
1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Possible-dup.mp3
Bất kỳ RDBMS nào cũng sẽ rất hữu ích ở đó để tổng hợp số lượng và chọn dữ liệu đó. Nhưng tiếp tục giải pháp dòng lệnh thuần túy mà bạn có thể muốn thực hiện các bước đơn giản như hơn nữa.
Xem các giá trị băm trùng lặp nếu có (bước bổ sung để hiển thị cách thức hoạt động, không cần thiết cho việc tìm bản sao):
$ count.by.regexp.awk '([0-9a-f]+):' mp3data.hashes
[1:54320b708cea0771a8cf71fac24196a070836376dd83eedd619f247c2ece7480]=1
[1:1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f]=2
[1:ad48913a11de29ad4639253f2f06d8480b73d48a5f1d0aaa24271c0ba3998d02]=1
- Và tất cả cùng nhau để liệt kê các tập tin trùng lặp theo nội dung :
$ grep mp3data.hashes -f <( count.by.regexp.awk '([0-9a-f]+):' mp3data.hashes | grep -oP '(?<=\[1:).{64}(?!]=1$)' ) | sort
1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Original.mp3
1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Possible-dup.mp3
8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other-dup.mp3
8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other.mp3
Count.by.regEx.awk là awk
tập lệnh đơn giản để đếm các mẫu regrec .