Menemukan dan menghapus file duplikat di osx dengan skrip

11

Dari: http://www.chriswrites.com/2012/02/how-to-find-and-delete-duplicate-files-in-mac-os-x/ Bagaimana cara memodifikasi ini untuk hanya menghapus versi pertama dari file yang dilihatnya.

Buka Terminal dari Spotlight atau folder Utilities Ubah ke direktori (folder) yang ingin Anda cari (termasuk sub-folder) menggunakan perintah cd. Pada prompt perintah ketik cd misalnya cd ~ / Documents untuk mengubah direktori ke folder Dokumen rumah Anda Pada prompt perintah, ketik perintah berikut:

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

Metode ini menggunakan checksum sederhana untuk menentukan apakah file identik. Nama-nama item duplikat akan terdaftar dalam file bernama duplicates.txt di direktori saat ini. Buka ini untuk melihat nama-nama file identik Sekarang ada berbagai cara untuk menghapus duplikat. Untuk menghapus semua file dalam file teks, pada jenis prompt perintah:

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

Jawaban:

4

Pertama, Anda harus menyusun ulang baris perintah pertama sehingga urutan file yang ditemukan oleh perintah find dipertahankan:

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

(Catatan: untuk keperluan pengujian di mesin saya yang saya gunakan find . -type f -exec cksum {} \;)

Kedua, satu cara untuk mencetak semua kecuali duplikat pertama adalah dengan menggunakan file tambahan, katakanlah /tmp/f2.tmp. Maka kita bisa melakukan sesuatu seperti:

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

Pastikan itu /tmp/f2.tmpada dan kosong sebelum Anda menjalankan ini, misalnya melalui perintah berikut:

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

Semoga ini bisa membantu =)

Janito Vaqueiro Ferreira Filho
sumber
39

Pilihan lain adalah menggunakan fdupes:

brew install fdupes
fdupes -r .

fdupes -r .menemukan file duplikat secara rekursif di bawah direktori saat ini. Tambah -duntuk menghapus duplikat - Anda akan diminta menyimpan file mana; jika sebaliknya Anda menambahkan -dN, fdupes akan selalu menyimpan file pertama dan menghapus file lainnya.

Lri
sumber
7
fdupesMengagumkan! Bekerja seperti pesona! Terima kasih kawan.!
racl101
3

Saya menulis sebuah skrip yang mengubah nama file Anda agar sesuai dengan hash isinya.

Ia menggunakan subset byte file sehingga cepat, dan jika ada tabrakan itu menambahkan penghitung ke nama seperti ini:

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

Ini membuatnya mudah untuk meninjau dan menghapus duplikat Anda sendiri, tanpa mempercayai perangkat lunak orang lain dengan foto Anda lebih dari yang Anda butuhkan.

Script: https://gist.github.com/SimplGy/75bb4fd26a12d4f16da6df1c4e506562

masukkan deskripsi gambar di sini

SimplGy
sumber
+1 hanya untuk tampilan GIF !!
NoobEditor
0

Ini dilakukan dengan bantuan aplikasi EagleFiler, yang dikembangkan oleh Michael 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

Anda juga dapat secara otomatis menghapus duplikat dengan penghapus file duplikat yang disarankan dalam posting ini .

Dejise
sumber
1
(1) Apa itu "EagleFiler"? Apakah ini bagian dari macOS? Jika tidak, dari mana Anda mendapatkannya? (2) Apakah itu dimaksudkan untuk menjadi satu blok kode yang panjang (cara saya memperbaikinya)? (3) Perbaiki lekukan Anda. (4) Bagaimana cara menggunakannya?
Scott