Recherche et suppression de fichiers en double dans OSX avec un script

11

De: http://www.chriswrites.com/2012/02/how-to-find-and-delete-duplicate-files-in-mac-os-x/ Comment puis-je le modifier pour ne supprimer que la première version de le fichier qu'il voit.

Ouvrez Terminal depuis Spotlight ou le dossier Utilitaires Accédez au répertoire (dossier) à partir duquel vous souhaitez effectuer la recherche (y compris les sous-dossiers) à l'aide de la commande cd. À l'invite de commandes, tapez cd, par exemple cd ~ / Documents pour modifier le répertoire dans votre dossier Documents d'accueil. À l'invite de commandes, tapez la commande suivante:

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

Cette méthode utilise une simple somme de contrôle pour déterminer si les fichiers sont identiques. Les noms des éléments en double seront répertoriés dans un fichier nommé duplicates.txt dans le répertoire en cours. Ouvrez-le pour afficher les noms de fichiers identiques. Il existe maintenant différentes façons de supprimer les doublons. Pour supprimer tous les fichiers du fichier texte, à l'invite de commande, tapez:

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

Réponses:

4

Tout d'abord, vous devrez réorganiser la première ligne de commande afin que l'ordre des fichiers trouvés par la commande find soit maintenu:

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

(Remarque: à des fins de test sur ma machine, j'ai utilisé find . -type f -exec cksum {} \;)

Deuxièmement, une façon de tout imprimer, sauf le premier en double, est d'utiliser un fichier auxiliaire, disons /tmp/f2.tmp. Ensuite, nous pourrions faire quelque chose comme:

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

Assurez-vous simplement qu'il /tmp/f2.tmpexiste et qu'il est vide avant de l'exécuter, par exemple via les commandes suivantes:

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

J'espère que cela aide =)

Janito Vaqueiro Ferreira Filho
la source
39

Une autre option consiste à utiliser fdupes:

brew install fdupes
fdupes -r .

fdupes -r .trouve les fichiers en double récursivement sous le répertoire courant. Ajouter -dpour supprimer les doublons - vous serez invité à choisir les fichiers à conserver; si à la place vous ajoutez -dN, fdupes conservera toujours le premier fichier et supprimera les autres fichiers.

Lri
la source
7
fdupesest génial! A fonctionné comme un charme! Merci mec.!
racl101
3

J'ai écrit un script qui renomme vos fichiers pour correspondre à un hachage de leur contenu.

Il utilise un sous-ensemble des octets du fichier, donc c'est rapide, et s'il y a une collision, il ajoute un compteur au nom comme ceci:

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

Cela facilite la vérification et la suppression des doublons par vous-même, sans faire plus confiance au logiciel de quelqu'un d'autre avec vos photos que vous n'en avez besoin.

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

entrez la description de l'image ici

SimplGy
la source
+1 juste pour l'affichage GIF !!
NoobEditor
0

Cela se fait à l'aide de l'application EagleFiler, développée par 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

Vous pouvez également supprimer automatiquement les doublons avec le suppresseur de fichiers en double suggéré dans cet article .

Dejise
la source
1
(1) Qu'est-ce que «EagleFiler»? Fait-il partie de macOS? Sinon, où l'obtenez-vous? (2) Est-ce que c'est censé être un long bloc de code (comme je l'ai corrigé)? (3) Veuillez corriger votre indentation. (4) Comment utilise-t-on exactement cela?
Scott