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"