คุณอาจใช้เครื่องมือใด ๆ ในการแปลงไฟล์เป็นสตรีมที่ไม่บีบอัด ( pcm
, wav
) โดยไม่มีข้อมูลเมตาดาต้าและเปรียบเทียบ สำหรับการแปลงคุณอาจใช้ซอฟต์แวร์ใด ๆ ที่คุณต้องชอบffmpeg
, หรือsox
avidemux
เช่นวิธีที่ฉันทำกับ ffmpeg
สมมติว่าฉันมีตัวอย่าง 2 ไฟล์ที่มีข้อมูลเมตาที่ต่างกัน:
$ diff Original.mp3 Possible-dup.mp3 ; echo $?
Binary files Original.mp3 and Possible-dup.mp3 differ
การเปรียบเทียบแรงเดรัจฉานกำลังบ่นว่ามันต่างกัน
จากนั้นเราเพียงแค่แปลงและกระจายเนื้อหา:
$ 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
; echo $?
ส่วนนอกหลักสูตร เป็นเพียงการสาธิตเพื่อดูรหัสส่งคืน
การประมวลผลหลายไฟล์ (ไดเรกทอรีสำรวจ)
หากคุณต้องการที่ซ้ำกันพยายามในการเก็บรวบรวมมันคุ้มค่าที่จะมีการคำนวณ checksums (ใด ๆ เช่นcrc
, md5
, sha2
, sha256
) ของข้อมูลและแล้วก็พบว่ามีการชนกัน
แม้ว่าจะอยู่นอกขอบเขตของคำถามนั้นฉันจะแนะนำคำแนะนำง่ายๆบางอย่างเกี่ยวกับวิธีการค้นหาไฟล์ที่ซ้ำกันในการทำบัญชีไดเรกทอรีเฉพาะเนื้อหาโดยไม่ต้องพิจารณาข้อมูลเมตา
- ขั้นแรกให้คำนวณแฮชของข้อมูลในแต่ละไฟล์ (และใส่ลงในไฟล์สำหรับการประมวลผลครั้งต่อไป):
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
ไฟล์จะมีลักษณะดังนี้:
$ cat mp3data.hashes
ad48913a11de29ad4639253f2f06d8480b73d48a5f1d0aaa24271c0ba3998d02:file1.mp3
54320b708cea0771a8cf71fac24196a070836376dd83eedd619f247c2ece7480:file2.mp3
1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Original.mp3
8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other-dup.mp3
8918674499b90ace36bcfb94d0d8ca1bc9f8bb391b166f899779b373905ddbc1:Other.mp3
1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f:Possible-dup.mp3
RDBMS ใด ๆ จะมีประโยชน์มากในการรวมจำนวนและเลือกข้อมูลดังกล่าว แต่ยังคงใช้โซลูชันบรรทัดคำสั่งที่บริสุทธิ์ต่อไปคุณอาจต้องการทำขั้นตอนง่าย ๆ เพิ่มเติม
ดูแฮชที่ซ้ำกันหากมี (ขั้นตอนเพิ่มเติมเพื่อแสดงวิธีการทำงานไม่จำเป็นสำหรับการค้นหาซ้ำ):
$ count.by.regexp.awk '([0-9a-f]+):' mp3data.hashes
[1:54320b708cea0771a8cf71fac24196a070836376dd83eedd619f247c2ece7480]=1
[1:1d8627a21bdbf74cc5c7bc9451f7db264c167f7df4cbad7d8db80bc2f347110f]=2
[1:ad48913a11de29ad4639253f2f06d8480b73d48a5f1d0aaa24271c0ba3998d02]=1
- และรวมเข้าด้วยกันเพื่อแสดงรายการไฟล์ที่ทำซ้ำโดยเนื้อหา :
$ 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.regexp.awkเป็นawk
สคริปต์ที่ง่ายต่อการนับรูปแบบ regexp