Unterschiedliche Dateien auf dem Server finden (Differenz zwischen zwei Ordnern)

Unterschiedliche Dateien auf dem Server finden (Differenz zwischen zwei Ordnern)

Manchmal kann es sehr praktisch sein die Dateien mit Unterschieden zwischen zwei Verzeichnissen zu finden, z. B. bei Shopsystemen und anderen Webapplikationen. Damit lässt sich der Inhalt von zwei Ordnern vergleichen, um gezielt die veränderten Dateien zu finden – z. B. zwischen einem produktiv eingesetztem Shopsystem und einer frischen (leeren) Installation derselben Version.

Wer die nachfolgenden Beispiele nicht versteht sollte das Shellscript nicht selbst ausführen, da dies Sicherheitsrisiken mit sich bringen kann.

Beispiel-Shellscript welches gezielt nur veränderte Dateien in ein zip-Archiv packt:

#!/bin/bash

SOURCE="/var/www/vhosts/example.com/httpdocs"
REFERENCE="/var/www/vhosts/test.example.com/reference"
ZIPFILE="/var/www/vhosts/example.com/difference.zip"

TMPDIFFDIR=$(mktemp -d)

cd "$SOURCE" || exit 1

find . -type f | while read -r file; do
    srcfile="$SOURCE/$file"
    reffile="$REFERENCE/$file"

    # Only compare files that exist in REFERENCE
    if [ -f "$reffile" ]; then
        if ! diff -q -u <(sed 's/[[:space:]]*$//' "$srcfile" | tr -d '\r') <(sed 's/[[:space:]]*$//' "$reffile" | tr -d '\r') >/dev/null 2>&1; then
            mkdir -p "$TMPDIFFDIR/$(dirname "$file")"
            cp --parents "$srcfile" "$TMPDIFFDIR"
        fi
    fi
done

cd "$TMPDIFFDIR" || exit 1
zip -r "$ZIPFILE" ./*

rm -rf "$TMPDIFFDIR"

echo "Done! Differences saved in $ZIPFILE"

und eine Variante welche auch neue, in der Referenz nicht vorhandene Dateien neben den geänderten Dateien, berücksichtigt:

#!/bin/bash

SOURCE="/var/www/vhosts/example.com/httpdocs"
REFERENCE="/var/www/vhosts/test.example.com/reference"
ZIPFILE="/var/www/vhosts/example.com/difference.zip"

TMPDIFFDIR=$(mktemp -d)

cd "$SOURCE" || exit 1

find . -type f | while read -r file; do
    srcfile="$SOURCE/$file"
    reffile="$REFERENCE/$file"

    if [ ! -f "$reffile" ]; then
       
        mkdir -p "$TMPDIFFDIR/$(dirname "$file")"
        cp --parents "$file" "$TMPDIFFDIR"
    else
      
        if ! diff -q -u <(sed 's/[[:space:]]*$//' "$srcfile" | tr -d '\r') <(sed 's/[[:space:]]*$//' "$reffile" | tr -d '\r') >/dev/null 2>&1; then
            mkdir -p "$TMPDIFFDIR/$(dirname "$file")"
            cp --parents "$file" "$TMPDIFFDIR"
        fi
    fi
done

cd "$TMPDIFFDIR" || exit 1
zip -r "$ZIPFILE" ./

rm -rf "$TMPDIFFDIR"

echo "Done! Differences saved in $ZIPFILE"

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert