Suchen und Entfernen doppelter Dateien in osx mit einem Skript


11

Von: http://www.chriswrites.com/2012/02/how-to-find-and-delete-duplicate-files-in-mac-os-x/ Wie ändere ich dies, um nur die erste Version von zu löschen? die Datei, die es sieht.

Öffnen Sie das Terminal über Spotlight oder den Ordner "Dienstprogramme". Wechseln Sie mit dem Befehl "cd" in das Verzeichnis (den Ordner), aus dem Sie suchen möchten (einschließlich der Unterordner). Geben Sie an der Eingabeaufforderung cd ein, z. B. cd ~ / Documents, um das Verzeichnis in den Ordner "Home Documents" zu ändern. Geben Sie an der Eingabeaufforderung den folgenden Befehl ein:

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

Diese Methode verwendet eine einfache Prüfsumme, um festzustellen, ob Dateien identisch sind. Die Namen doppelter Elemente werden in einer Datei mit dem Namen duplicates.txt im aktuellen Verzeichnis aufgelistet. Öffnen Sie diese Option, um die Namen identischer Dateien anzuzeigen. Es gibt jetzt verschiedene Möglichkeiten, die Duplikate zu löschen. Geben Sie an der Eingabeaufforderung Folgendes ein, um alle Dateien in der Textdatei zu löschen:

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

Antworten:


4

Zunächst müssen Sie die erste Befehlszeile neu anordnen, damit die Reihenfolge der vom Befehl find gefundenen Dateien beibehalten wird:

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

(Hinweis: Zu Testzwecken in meinem Computer habe ich verwendet find . -type f -exec cksum {} \;)

Zweitens besteht eine Möglichkeit, alle bis auf das erste Duplikat zu drucken, in der Verwendung einer Hilfsdatei /tmp/f2.tmp. Dann könnten wir so etwas machen wie:

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

Stellen Sie einfach sicher, dass es /tmp/f2.tmpvorhanden und leer ist, bevor Sie dies ausführen, beispielsweise mit den folgenden Befehlen:

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

Hoffe das hilft =)


37

Eine andere Option ist die Verwendung von fdupes:

brew install fdupes
fdupes -r .

fdupes -r .findet doppelte Dateien rekursiv im aktuellen Verzeichnis. Hinzufügen -d, um die Duplikate zu löschen - Sie werden gefragt, welche Dateien aufbewahrt werden sollen. Wenn Sie stattdessen hinzufügen -dN, behält fdupes immer die erste Datei und löscht andere Dateien.


6
fdupesist großartig! Lief wie am Schnürchen! Dank bro.!
racl101

3

Ich habe ein Skript geschrieben, das Ihre Dateien so umbenennt, dass sie mit einem Hash ihres Inhalts übereinstimmen.

Es verwendet eine Teilmenge der Bytes der Datei, damit es schnell geht, und wenn es zu einer Kollision kommt, wird ein Zähler an den Namen wie folgt angehängt:

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

Auf diese Weise können Sie Duplikate ganz einfach selbst überprüfen und löschen, ohne der Software eines anderen Ihre Fotos mehr als nötig anvertrauen zu müssen.

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

Geben Sie hier die Bildbeschreibung ein


+1 nur für das GIF-Display !!
NoobEditor

0

Dies geschieht mit Hilfe der von Michael Tsai entwickelten EagleFiler-App .

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

Sie können Duplikate auch automatisch mit dem in diesem Beitrag vorgeschlagenen Entferner für doppelte Dateien löschen .


1
(1) Was ist "EagleFiler"? Ist es Teil von macOS? Wenn nicht, woher bekommen Sie es? (2) Soll das ein langer Codeblock sein (so wie ich es repariert habe)? (3) Bitte korrigieren Sie Ihre Einrückung. (4) Wie genau benutzt man das?
Scott
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.