Ich habe hier ein Bashskript, welches Dateien überwacht (noch nicht vollständig und absolut unoptimiert). Ich weiß, dass es Tools gibt, aber es ist ein Projekt für die Uni und deshalb ist Optimierung und Effizienz nicht wirklich wichtig. Ich möchte damit die Grundlagen des Shellscriptings einfach etwas lernen.
Das ist bisher das Script:
#!/bin/bash
echo "Das Skript wurde gestartet. Der Typ Ihres Betriebssystem ist "\"$OSTYPE\""."
# If-Abfrage, die das Betriebssystem erkennt und den Pfad zum überwachten Ordner oder Datei festlegt # HIER BITTE DIE PFADE ZUM ZU ÜBERWACHENDEN ORDNER EINTRAGEN
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
BASE_DIRECTORY=" " # Übergibt dem überwachten Ordner eine Variable, wenn Betriebssystem = Linux
elif [[ "$OSTYPE" == "darwin"* ]]; then
BASE_DIRECTORY="/Users/name/Library/CloudStorage/GoogleDrive-email@gmail.com/Meine Ablage/Uni/TestOrdner" # Übergibt dem überwachten Ordner eine Variable, wenn Betriebssystem = MacOs
elif [[ "$OSTYPE" == "win32" || "$OSTYPE" == "msys" || "$OSTYPE" == "cygwin" ]]; then
BASE_DIRECTORY="/g/Meine Ablage/Uni/TestOrdner" # Übergibt dem überwachten Ordner eine Variable, wenn Betriebssystem = Windows
else
echo "Das Betriebssystem ist unbekannt." # Wenn das Betriebssystem unbekannt ist, wird eine Fehlermeldung ausgegeben
exit 1
fi
DIRECTORY="$BASE_DIRECTORY" # Pfad zum Ordner
FILE="$BASE_DIRECTORY/Datei.txt" # Pfad zur Datei
FILE2="$BASE_DIRECTORY/Datei2.txt" # Pfad zur Datei2
cd "$BASE_DIRECTORY" || {
echo "Wechsel zu $BASE_DIRECTORY fehlgeschlagen!" # Wechselt in den TestOrdner oder gibt eine Fehlermeldung aus
exit 1;
}
# Funktion, um zu überprüfen, ob Dateien gelöscht wurden
checkIfDeleted() {
if [ ! -f "$FILE" ]; then
echo "Die Datei \"$(basename "$FILE")\" wurde gelöscht, umbenannt oder verschoben."
elif [ ! -f "$FILE2" ]; then
echo "Die Datei \"$(basename "$FILE2")\" wurde gelöscht, umbenannt oder verschoben."
elif [ ! -d "$DIRECTORY" ]; then
echo "Der Ordner \"$(basename "$DIRECTORY")\" wurde gelöscht, umbenannt oder verschoben."
fi
}
# Speichert den "ursprünglichen" Hash-Wert der Dateien
ORIGINAL_HASH=$(md5 -q "$FILE")
ORIGINAL_HASH2=$(md5 -q "$FILE2")
checkIfEdited() {
if [ ! -f "$FILE" ]; then # Wenn $FILE nicht existiert, dann wird das Skript hier beendet
return
fi
if [ ! -f "$FILE2" ]; then # Wenn $FILE2 nicht existiert, dann wird das Skript hier beendet
return
fi
if [ ! -d "$DIRECTORY" ]; then # Wenn $DIRECTORY nicht existiert, dann wird das Skript hier beendet
return
fi
# Berechnet den aktuellen Hash-Wert der Dateien
CURRENT_HASH=$(md5 -q "$FILE")
CURRENT_HASH2=$(md5 -q "$FILE2")
# Hash-Werte werden verglichen
if [ "$CURRENT_HASH" != "$ORIGINAL_HASH" ]; then
echo "Die Datei \"$(basename "$FILE")\" wurde bearbeitet."
# Ursprünglicher Hash-Wert wird für zukünftige Überprüfungen aktualisiert
ORIGINAL_HASH="$CURRENT_HASH"
elif [ "$CURRENT_HASH2" != "$ORIGINAL_HASH2" ]; then
echo "Die Datei \"$(basename "$FILE2")\" wurde bearbeitet."
# Ursprünglicher Hash-Wert wird für zukünftige Überprüfungen aktualisiert
ORIGINAL_HASH2="$CURRENT_HASH2"
fi
}
while true; do # Endlosschleife, die die Funktionen "checkIfDeleted" und "checkIfEdited" alle 10 Sekunden ausführt
checkIfDeleted
checkIfEdited
sleep 10
done
Ja, ich weiß, welche Probleme das Skript mit sich bringt, aber ich habe ein anderes Problem:
Wenn jemand das Skript nutzen möchte, muss er die Pfade seiner Dateien einfügen und sogar neue Variablen definieren.
Man könnte das doch so machen, dass das Skript die Liste des Ordners einliest und dann auf alle Dateien direkt zugreifen muss, ohne dass man sie in das Skript einfügen muss.
Also irgendwie mit dem Befehl "ls". Ich weiß aber nicht, wie ich das implementieren soll.
Kann mir wer helfen bitte?