ค้นหาโฟลเดอร์ทั้งหมดในไดเรกทอรีที่มีเนื้อหาเหมือนกัน


10

ในอูบุนตูมีใครบ้างที่จะค้นหาโฟลเดอร์ที่ซ้ำกันในไดเรกทอรี (เช่นโฟลเดอร์ที่มีเนื้อหาเดียวกัน) ฉันคิดว่ามีเครื่องมือบรรทัดคำสั่งบางตัวสำหรับค้นหาไฟล์ที่ซ้ำกัน (เช่น fdupes) แต่ฉันต้องการค้นหาโฟลเดอร์ที่ซ้ำกันแทน นั่นคือค้นหาโฟลเดอร์ที่ตรงกับเนื้อหาของไฟล์ที่มี (แม้ว่าชื่อไฟล์และข้อมูลเมตาอื่น ๆ อาจแตกต่างกัน)


ฉันอาจเริ่มต้นด้วยการสร้างรายการโฟลเดอร์ทั้งหมดในไดเรกทอรี (เรียงตามความยาว) จากนั้นตรวจสอบแต่ละโฟลเดอร์ที่มีความยาวเท่ากัน
Anderson Green

กำหนด "ซ้ำกัน" ไฟล์ภายในต้องตรงกันกับเนื้อหาไฟล์เท่านั้นหรือไม่ ชื่อไฟล์? หมายเลขไอโหนด? ขนาดไฟล์?
Chris Down

@ChrisDown คำถามได้รับการปรับปรุงแล้ว
Anderson Green

3
ใช่. ไดเรกทอรีเป็นเพียงไฟล์จริงๆดังนั้นข้อความของคุณจึงไม่ชัดเจน ในการมี "เนื้อหาเดียวกัน" ในความเป็นจริงก็หมายความว่าไดเรกทอรีทั้งสองมีการอ้างอิงไอโหนดเดียวกัน ไม่ชัดเจนว่าคุณหมายถึงหรือว่าคุณหมายถึงว่าไฟล์ที่อยู่ข้างในควรมีเนื้อหาเดียวกันและหากเป็นเช่นนั้นมีข้อกำหนดอื่น ๆ (mtime, filename ฯลฯ )
Chris Down

3
@ChrisDown ฉันหมายความว่าไฟล์ที่อยู่ภายในควรมีเนื้อหาเหมือนกัน
Anderson Green

คำตอบ:


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"

คุณสามารถดูได้จากที่นี่:

$ 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

เนื่องจากสคริปต์นี้ยังไม่ผ่านการทดสอบฉันกระตือรือร้นที่จะดูว่ามันทำงานตามที่ควรหรือไม่
Anderson Green

1
@AndersonGreen ตรวจสอบคำตอบที่ปรับปรุงแล้วทดสอบ
Chris Down

ดี! ควรมีการทดสอบด้วยcat > 1/2 <<< barและcat > 2/3 <<< bar เพื่อแสดงไฟล์หลาย ๆ ไฟล์และเมตาดาต้าที่แตกต่างกัน (== "เหมือนกัน")
nealmcb

@ChrisDown: จำเป็นต้องเรียงลำดับในขั้นตอนสุดท้ายหรือไม่
harish.venkat

สคริปต์ที่สง่างามข้อผิดพลาดเล็กน้อยเพียงอย่างเดียวคือมันจะคืนค่าเหมือนกันเมื่อไม่มีไดเรกทอรีใดไดเรกทอรีหนึ่งหรือทั้งสอง ควรแก้ไขได้ง่ายหากสคริปต์ดีกว่า I
cosine
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.