Suchen und Entfernen doppelter Dateien in OSX mit einem Skript

Suchen und Entfernen doppelter Dateien in OSX mit einem Skript

Aus: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 der Datei zu löschen, die es sieht?

Öffnen Sie Terminal über Spotlight oder den Ordner „Dienstprogramme“. Wechseln Sie mit dem Befehl cd in das Verzeichnis (den Ordner), in dem Sie suchen möchten (einschließlich Unterordner). Geben Sie in der Eingabeaufforderung cd ein, z. B. cd ~/Documents, um in das Verzeichnis Ihres Home-Dokumentenordners zu wechseln. Geben Sie in 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 zu ermitteln, ob Dateien identisch sind. Die Namen doppelter Elemente werden in einer Datei namens duplicates.txt im aktuellen Verzeichnis aufgelistet. Öffnen Sie diese, um die Namen identischer Dateien anzuzeigen. Es gibt nun verschiedene Möglichkeiten, die Duplikate zu löschen. Um alle Dateien in der Textdatei zu löschen, geben Sie in der Eingabeaufforderung Folgendes ein:

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

Antwort1

Zunächst müssen Sie die erste Befehlszeile neu anordnen, sodass die Reihenfolge der vom Befehl „find“ gefundenen Dateien erhalten bleibt:

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 habe ich auf meiner Maschine verwendet find . -type f -exec cksum {} \;)

Zweitens können Sie alle Duplikate außer dem ersten ausdrucken, indem Sie eine Hilfsdatei verwenden, sagen wir /tmp/f2.tmp. Dann könnten wir etwas tun 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 es ausführen, beispielsweise mit den folgenden Befehlen:

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

Hoffe das hilft =)

Antwort2

Eine andere Möglichkeit besteht darin, fdupes zu verwenden:

brew install fdupes
fdupes -r .

fdupes -r .sucht rekursiv nach doppelten Dateien im aktuellen Verzeichnis. Fügen Sie hinzu, -dum die Duplikate zu löschen. Sie werden gefragt, welche Dateien behalten werden sollen. Wenn Sie stattdessen hinzufügen -dN, behält fdupes immer die erste Datei und löscht die anderen Dateien.

Antwort3

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 ist, und hängt im Falle einer Kollision einen Zähler an den Namen an, etwa wie folgt:

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

Auf diese Weise können Sie Duplikate problemlos selbst prüfen und löschen, ohne Ihre Fotos unnötig der Software einer anderen Person anzuvertrauen.

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

Bildbeschreibung hier eingeben

Antwort4

Dies geschieht mit Hilfe der EagleFiler-App, entwickelt vonMichael 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

Sie können Duplikate auch automatisch mit dem Duplicate File Remover löschen, der indieser Beitrag.

verwandte Informationen