
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 -q
Option verwenden:
diff -r -q dir1 dir2
Antwort2
Emulieren, wie Tools wie comm
oder join
zwei 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 bash
Arrays, 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.