Unterschiede zwischen zwei Verzeichnissen mit allen Details abrufen

Unterschiede zwischen zwei Verzeichnissen mit allen Details abrufen

Ich habe zwei Verzeichnisse und brauche die Ausgabe der Unterschiede in diesem Format

Beispiel :

DIR1 conatins :   file1
                  file2
                  file3
DIR2 contains :   file1
                  file4

Ausgabe (nur Dateinamen, kein Dateiinhalt): Datei1 ist geändert oder gleich, Datei2 ist entfernt, Datei4 ist hinzugefügt

Antwort1

Das ist ganz einfach. Schauen Sie sich das beliebte Tool an diff: diff -r dir1 dir2 Edit: Ich habe die Frage des OP falsch beantwortet, um nur die Informationen zu erhaltenDasdie Dateien unterscheiden sich, nichtWieSie unterscheiden sich, Sie müssen die -qOption verwenden: diff -r -q dir1 dir2

Antwort2

Emulieren, wie Tools wie commoder joinzwei sortierte Eingabesätze vergleichen würden, unter Verwendung von bash:

# Get lists of (base-)names from both directories.
files1=( dir1/* ); files1=( "${files1[@]##*/}" )
files2=( dir2/* ); files2=( "${files2[@]##*/}" )

# Loop over these sorted lists until one of them is empty.
while [[ ${#files1[@]} -gt 0 ]] && [[ ${#files2[@]} -gt 0 ]]; do
        name1=${files1[0]}
        name2=${files2[0]}

        if [[ $name1 == "$name2" ]]; then
                # Name exists in both directories.
                printf '%s is modified or same\n' "$name1"
                files1=( "${files1[@]:1}" )
                files2=( "${files2[@]:1}" )
        elif [[ $name1 < $name2 ]]; then
                # Name exists in only first directory.
                printf '%s is removed\n' "$name1"
                files1=( "${files1[@]:1}" )
        else
                # Name exists in only second directory.
                printf '%s is added\n' "$name2"
                files2=( "${files2[@]:1}" )
        fi
done

# Handle remaining names.
if [[ ${#files1[@]} -gt 0 ]]; then
        printf '%s is removed\n' "${files1[@]}"
fi
if [[ ${#files2[@]} -gt 0 ]]; then
        printf '%s is added\n' "${files2[@]}"
fi

Ich verwende zwei bashArrays, um die in jedem Verzeichnis gefundenen Namen zu speichern, und iteriere dann, bis eines dieser Arrays leer ist.

In der Schleife vergleiche ich die Vornamen der einzelnen Arrays miteinander. Sind die Namen gleich, dann ist die Datei gleich oder wurde evtl. verändert (der Name wird dann aus beiden Arrays entfernt).

Wenn der Name aus dem ersten Array vor dem Namen aus dem zweiten Array sortiert wird (getestet mit <), dann fehlt der erste Name im zweiten Verzeichnis. Löschen Sie nun das erste Element des ersten Arrays.

Andernfalls fehlt der Name aus dem zweiten Array im ersten Verzeichnis. Löschen Sie nun das erste Element des zweiten Arrays.

Nach der Schleife ist eines der Arrays möglicherweise noch nicht leer. Geben Sie daher bei Bedarf die Namen aus diesem Array aus.

verwandte Informationen