Bir komut dosyasıyla osx'ta yinelenen dosyaları bulma ve kaldırma


11

Gönderen: http://www.chriswrites.com/2012/02/how-to-find-and-delete-duplicate-files-in-mac-os-x/ Bunu yalnızca ilk sürümünü silmek için nasıl değiştiririm? gördüğü dosya.

Terminal'i Spotlight'tan veya Yardımcı Programlar klasöründen açın Cd komutunu kullanarak aramak istediğiniz dizine (alt klasörler dahil) geçin. Komut istemine cd yazın / örneğin cd ~ / Documents dizini ev Belgeler klasörünüze dönüştürmek için Komut istemine aşağıdaki komutu yazın:

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

Bu yöntem, dosyaların aynı olup olmadığını belirlemek için basit bir sağlama toplamı kullanır. Yinelenen öğelerin adları, geçerli dizindeki duplicates.txt adlı bir dosyada listelenir. Aynı dosyaların adlarını görüntülemek için bunu açın Artık kopyaları silmenin çeşitli yolları vardır. Metin dosyasındaki tüm dosyaları silmek için komut istemine şunu yazın:

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

Yanıtlar:


4

İlk olarak, find komutu tarafından bulunan dosyaların sırası korunacak şekilde ilk komut satırını yeniden sıralamanız gerekir:

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

(Not: Makinemde test amacıyla kullandım find . -type f -exec cksum {} \;)

İkincisi, ilk kopya dışında tümünü yazdırmanın bir yolu, yardımcı bir dosya kullanmaktır /tmp/f2.tmp. Sonra şöyle bir şey yapabiliriz:

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

Bunu /tmp/f2.tmpçalıştırmadan önce var olduğunu ve boş olduğundan emin olun, örneğin aşağıdaki komutlarla:

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

Umarım bu yardımcı olur =)


39

Başka bir seçenek fdupes kullanmaktır:

brew install fdupes
fdupes -r .

fdupes -r .geçerli dizinin altında yinelenen dosyaları bulur. Kopyaları -dsilmek için Ekle - hangi dosyaları saklamanız istenir; bunun yerine eklerseniz -dN, fdupes her zaman ilk dosyayı saklar ve diğer dosyaları siler.


7
fdupesharika! Bir cazibe gibi çalıştı! Sağ ol, kanka.!
racl101

3

Dosyalarınızı içeriklerinin bir karmasıyla eşleşecek şekilde yeniden adlandıran bir komut dosyası yazdım.

Dosyanın baytlarının bir alt kümesini kullanır, bu nedenle hızlıdır ve bir çarpışma varsa, adı aşağıdaki gibi bir sayaç ekler:

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

Bu, başkalarının yazılımlarına fotoğraflarınızdan ihtiyacınız olduğundan daha fazla güvenmeden kopyaları kendi başınıza incelemenizi ve silmenizi kolaylaştırır.

Komut Dosyası: https://gist.github.com/SimplGy/75bb4fd26a12d4f16da6df1c4e506562

resim açıklamasını buraya girin


Sadece GIF ekranı için +1!
NoobEditor

0

Bu Michael Tsai tarafından geliştirilen EagleFiler uygulaması yardımı ile yapılır .

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

Ayrıca bu yayında önerilen yinelenen dosya sökücü ile yinelenenleri otomatik olarak silebilirsiniz .


1
(1) “EagleFiler” nedir? MacOS'un bir parçası mı? Değilse, nereden alıyorsunuz? (2) Bu uzun bir kod bloğu mu demekti (düzelttiğim gibi)? (3) Lütfen girintinizi düzeltin. (4) Tam olarak bunu nasıl kullanır?
Scott
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.