GNU/Linux >> LINUX-Kenntnisse >  >> Linux

BASH:Doppelte Dateien finden (MAC/LINUX-kompatibel)

Es funktioniert für mich auf meinem Mac, Sie werden die doppelte Datei anhand ihres md5-Werts erkennen:

find ./ -type f -exec md5 {} \; | awk -F '=' '{print $2 "\t" $1}' | sort

Ich weiß nichts über Mac-Kompatibilität, aber das funktioniert für mich (TM):

#!/bin/bash
[ -n "$1" ] || exit 1
exec 9< <( find "$1" -type f -print0 )
while IFS= read -r -d '' -u 9
do
    file_path="$(readlink -fn -- "$REPLY"; echo x)"
    file_path="${file_path%x}"
    exec 8< <( find "$1" -type f -not -path "$file_path" -print0 )
    while IFS= read -r -d '' -u 8 OTHER
    do
        cmp --quiet -- "$REPLY" "$OTHER"
        case $? in
            0)
                echo -n "cmp -- "
                printf %q "${REPLY}"
                echo -n ' '
                printf %q "${OTHER}"
                echo ""
                break
                ;;
            2)
                echo "\`cmp\` failed!"
                exit 2
                ;;
            *)
                :
                ;;
        esac
    done
done

Das Ergebnis ist eine Reihe von Befehlen, die Sie ausführen können, um zu überprüfen, ob das Ergebnis korrekt ist :)

Bearbeiten:Die letzte Version arbeitet mit wirklich seltsamen Dateinamen wie:

$'/tmp/--$`\\! *@ \a\b\E\E\f\r\t\v\\"\' \n'

Dadurch werden Dateien unter einem Verzeichnis mit Duplikaten gefunden. Es ist ziemlich roh, aber es funktioniert.

#!/bin/bash

CKSUMPROG=md5sum
TMPFILE=${TMPDIR:-/tmp}/duplicate.$$
trap "rm -f $TMPFILE" EXIT INT

if [ ! -d "$1" ]
then
    echo "usage $0 directory" >2
    exit 1
fi

PRINTBLANK=
# dump fingerprints from all target files into a tmpfile
find "$1" -type f 2> /dev/null | xargs $CKSUMPROG  > $TMPFILE 2> /dev/null

# get fingerprints from tmpfile, get the ones with duplicates which means multiple files with same contents
for DUPEMD5 in $(cut -d ' ' -f 1 $TMPFILE | sort  | uniq -c | sort -rn | grep -v '^  *1 ' | sed 's/^ *[1-9][0-9]* //')
do
    if [ -z "$PRINTBLANK" ]
    then
        PRINTBLANK=1
    else
        echo
        echo
    fi

    grep "^${DUPEMD5} " $TMPFILE | gawk '{print $2}'
done

Linux
  1. So finden Sie die zuletzt oder heute geänderten Dateien in Linux

  2. 5 Befehlszeilen-Tools zum schnellen Auffinden von Dateien unter Linux

  3. 25 Nützliche praktische Beispiele für find-Befehle unter Linux

  4. So finden Sie doppelte Dateien in Linux

  5. Wie finde ich doppelte Dateien in Linux? Hilfe ist hier mit dem fdupes-Befehl!

So zählen Sie Dateien im Verzeichnis in Linux

So finden und löschen Sie doppelte Dateien in Linux

Die 3 besten Tools zum Suchen und Löschen doppelter Dateien in Linux

So finden Sie doppelte Dateien in Linux und entfernen sie

Finden Sie Dateien und Verzeichnisse unter Linux ganz einfach

Finden Sie Text in Dateien unter Linux mit grep