การค้นหาและลบไฟล์ที่ซ้ำกันใน osx ด้วยสคริปต์


11

จาก: http://www.chriswrites.com/2012/02/how-to-find-and-delete-duplicate-files-in-mac-os-x/ ฉันจะแก้ไขได้อย่างไรเพื่อลบเฉพาะเวอร์ชันแรกของ ไฟล์ที่เห็น

เปิด Terminal จาก Spotlight หรือโฟลเดอร์ Utilities เปลี่ยนเป็นไดเรกทอรี (โฟลเดอร์) ที่คุณต้องการค้นหา (รวมถึงโฟลเดอร์ย่อย) โดยใช้คำสั่ง cd ที่พรอมต์คำสั่งพิมพ์ cd เช่น cd ~ / Documents เพื่อเปลี่ยนไดเรกทอรีเป็นโฟลเดอร์เอกสารที่บ้านของคุณที่พรอมต์คำสั่งพิมพ์คำสั่งต่อไปนี้:

find . -size 20 \! -type d -exec cksum {} \; | sort | tee /tmp/f.tmp | cut -f 1,2 -d ' ' | uniq -d | grep -hif  /tmp/f.tmp > duplicates.txt

วิธีนี้ใช้การตรวจสอบอย่างง่ายเพื่อตรวจสอบว่าไฟล์เหมือนกัน ชื่อของรายการที่ซ้ำกันจะแสดงอยู่ในไฟล์ชื่อ Dupates.txt ในไดเรกทอรีปัจจุบัน เปิดสิ่งนี้เพื่อดูชื่อของไฟล์ที่เหมือนกันขณะนี้มีหลายวิธีในการลบไฟล์ที่ซ้ำกัน ในการลบไฟล์ทั้งหมดในไฟล์ข้อความที่พรอมต์คำสั่งให้พิมพ์:

while read file; do rm "$file"; done < duplicates.txt

คำตอบ:


4

ประการแรกคุณจะต้องเรียงลำดับบรรทัดคำสั่งแรกใหม่เพื่อให้ลำดับของไฟล์ที่พบโดยคำสั่ง find ถูกเก็บรักษาไว้:

find . -size 20 ! -type d -exec cksum {} \; | tee /tmp/f.tmp | cut -f 1,2 -d   | sort | uniq -d | grep -hif  /tmp/f.tmp > duplicates.txt

(หมายเหตุ: สำหรับวัตถุประสงค์ในการทดสอบในเครื่องของฉันฉันใช้find . -type f -exec cksum {} \;)

ประการที่สองวิธีหนึ่งที่จะพิมพ์ทั้งหมด /tmp/f2.tmpแต่ที่ซ้ำกันเป็นครั้งแรกโดยการใช้ไฟล์เสริมสมมติว่า จากนั้นเราสามารถทำสิ่งที่ชอบ:

while read line; do
    checksum=$(echo "$line" | cut -f 1,2 -d' ')
    file=$(echo "$line" | cut -f 3 -d' ')

    if grep "$checksum" /tmp/f2.tmp > /dev/null; then
        # /tmp/f2.tmp already contains the checksum
        # print the file name
        # (printf is safer than echo, when for example "$file" starts with "-")
        printf %s\\n "$file"
    else
        echo "$checksum" >> /tmp/f2.tmp
    fi
done < duplicates.txt

ตรวจสอบให้แน่ใจว่า/tmp/f2.tmpมีอยู่แล้วและว่างเปล่าก่อนที่คุณจะรันสิ่งนี้ตัวอย่างเช่นผ่านคำสั่งต่อไปนี้:

rm /tmp/f2.tmp
touch /tmp/f2.tmp

หวังว่านี่จะช่วย =)


39

ตัวเลือกอื่นคือใช้ fdupes:

brew install fdupes
fdupes -r .

fdupes -r .ค้นหาไฟล์ที่ซ้ำกันซ้ำภายใต้ไดเรกทอรีปัจจุบัน เพิ่ม-dเพื่อลบรายการซ้ำ - คุณจะได้รับพร้อมท์ให้เก็บไฟล์ไว้ หากคุณเพิ่มแทน-dNfdupes จะเก็บไฟล์แรกเสมอและลบไฟล์อื่น ๆ


7
fdupesมันยอดเยี่ยม! ทำงานเหมือนจับใจ! ขอบคุณครับ.!
racl101

3

ฉันเขียนสคริปต์ที่เปลี่ยนชื่อไฟล์ของคุณเพื่อให้ตรงกับเนื้อหาของแฮช

มันใช้เซ็ตย่อยของไบต์ของไฟล์ดังนั้นมันจึงเร็วและหากมีการชนกันมันจะต่อท้ายเคาน์เตอร์กับชื่อดังนี้:

3101ace8db9f.jpg
3101ace8db9f (1).jpg
3101ace8db9f (2).jpg

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

สคริปต์: https://gist.github.com/SimplGy/75bb4fd26a12d4f16da6df1c4e506562

ป้อนคำอธิบายรูปภาพที่นี่


+1 สำหรับการแสดง GIF !!
NoobEditor

0

นี้จะกระทำด้วยความช่วยเหลือของ EagleFiler app ที่พัฒนาโดยไมเคิล Tsai

tell application "EagleFiler"

      set _checksums to {}
      set _recordsSeen to {}
      set _records to selected records of browser window 1
      set _trash to trash of document of browser window 1
      repeat with _record in _records
          set _checksum to _record's checksum
          set _matches to my findMatch(_checksum, _checksums, _recordsSeen)
          if _matches is {} then
              set _checksums to {_checksum} & _checksums
              set _recordsSeen to {_record} & _recordsSeen
          else
              set _otherRecord to item 1 of _matches
              if _otherRecord's modification date > _record's modification date 
then

            set _record's container to _trash
            else
                set _otherRecord's container to _trash
                set _checksums to {_checksum} & _checksums
                set _recordsSeen to {_record} & _recordsSeen
            end if
        end if
    end repeat
end tell

on findMatch(_checksum, _checksums, _recordsSeen)

    tell application "EagleFiler"
        if _checksum is "" then return {}
        if _checksums contains _checksum then
            repeat with i from 1 to length of _checksums
                if item i of _checksums is _checksum then
                    return item i of _recordsSeen
                end if
            end repeat
        end if
        return {}
    end tell

end findMatch

คุณสามารถลบรายการที่ซ้ำกันโดยอัตโนมัติด้วยตัวกำจัดไฟล์ซ้ำที่แนะนำในโพสต์นี้


1
(1)“ EagleFiler” คืออะไร? มันเป็นส่วนหนึ่งของ macOS หรือไม่? ถ้าไม่คุณจะได้รับที่ไหน (2) นั่นหมายถึงการเป็นรหัสยาวหนึ่งบล็อก (วิธีที่ฉันแก้ไข) หรือไม่? (3) โปรดแก้ไขการเยื้องของคุณ (4) เราใช้สิ่งนี้ได้อย่างไร
สกอตต์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.