Linux diff-Befehl: Dateivergleich

LinuxLinuxBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab werden wir den Befehl diff erkunden, ein essentielles Werkzeug für Softwareentwickler und Systemadministratoren, die mit Linux arbeiten. Der Befehl diff wird verwendet, um den Inhalt zweier Dateien zu vergleichen und die Unterschiede zwischen ihnen hervorzuheben. Diese Fähigkeit ist besonders wertvoll bei der Verwaltung von Codeversionen, der Überprüfung von Änderungen in Konfigurationsdateien oder der Identifizierung von Diskrepanzen in textbasierten Daten.

Wir werden ein Szenario der Softwareentwicklung simulieren, in dem Sie den Befehl diff verwenden, um verschiedene Versionen von Dateien zu vergleichen. Dies hilft Ihnen zu verstehen, wie dieser Befehl in realen Situationen angewendet werden kann.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/FileandDirectoryManagementGroup(["File and Directory Management"]) linux(("Linux")) -.-> linux/VersionControlandTextEditorsGroup(["Version Control and Text Editors"]) linux/FileandDirectoryManagementGroup -.-> linux/cd("Directory Changing") linux/VersionControlandTextEditorsGroup -.-> linux/diff("File Comparing") subgraph Lab Skills linux/cd -.-> lab-219189{{"Linux diff-Befehl: Dateivergleich"}} linux/diff -.-> lab-219189{{"Linux diff-Befehl: Dateivergleich"}} end

Grundlegende Verwendung von diff verstehen

Beginnen wir damit, zwei einfache Textdateien zu vergleichen, um die grundlegende Ausgabe des Befehls diff zu verstehen.

Zunächst navigieren wir in das Projektverzeichnis:

cd /home/labex/project

Nun verwenden wir den Befehl diff, um zwei Dateien zu vergleichen:

diff file1.txt file2.txt

Sie sollten eine Ausgabe ähnlich der folgenden sehen:

1,2c1,2
< This is version 1 of the file.
< It contains some initial content.
---
> This is version 2 of the file.
> It contains updated content.
4c4
< This is the fourth line.
---
> This is a modified fourth line.

Lassen Sie uns diese Ausgabe analysieren:

  • Die Zahlen (wie 1,2c1,2) geben die Zeilennummern in beiden Dateien an, an denen Änderungen auftreten.
  • Der Buchstabe c steht für "change" (Änderung). Andere mögliche Buchstaben sind a für "add" (Hinzufügen) und d für "delete" (Löschen).
  • Zeilen, die mit < beginnen, stammen aus der ersten Datei (file1.txt).
  • Zeilen, die mit > beginnen, stammen aus der zweiten Datei (file2.txt).
  • Das --- trennt den Inhalt der ersten Datei vom Inhalt der zweiten Datei.

Diese Ausgabe sagt uns Folgendes:

  1. Die Zeilen 1 und 2 in beiden Dateien sind unterschiedlich.
  2. Die Zeile 4 in beiden Dateien ist unterschiedlich.
  3. Die Zeile 3 (nicht in der Ausgabe gezeigt) ist in beiden Dateien identisch.

Vergleich von Python-Skripten

Nun wenden wir den Befehl diff auf ein realistischeres Szenario an. Stellen Sie sich vor, Sie arbeiten an einem Python-Skript und möchten zwei Versionen vergleichen.

Zunächst schauen wir uns den Inhalt beider Skriptversionen an:

cat script_v1.py

Sie sollten Folgendes sehen:

def greet(name):
    print("Hello, " + name + "!")

def main():
    name = input("Enter your name: ")
    greet(name)

if __name__ == "__main__":
    main()

Nun schauen wir uns die zweite Version an:

cat script_v2.py

Sie sollten Folgendes sehen:

def greet(name):
    print(f"Hello, {name.capitalize()}!")

def main():
    name = input("Enter your name: ")
    greet(name)
    print("Thank you for using this script!")

if __name__ == "__main__":
    main()

Nun verwenden wir diff, um diese Skripte zu vergleichen:

diff script_v1.py script_v2.py

Sie sollten eine Ausgabe ähnlich der folgenden sehen:

2c2
<     print("Hello, " + name + "!")
---
>     print(f"Hello, {name.capitalize()}!")
6a7
>     print("Thank you for using this script!")

Diese Ausgabe sagt uns:

  1. Die Zeile 2 wurde geändert. Der Gruß verwendet jetzt einen f-String und setzt den Namen in Großbuchstaben.
  2. Eine neue Zeile (Zeile 7 in der neuen Version) wurde mit einer Dankesnachricht hinzugefügt.

Verwendung des einheitlichen Formats

Das einheitliche Format (-u-Option) liefert eine besser lesbare Ausgabe, insbesondere für größere Dateien oder wenn Kontextinformationen wichtig sind.

Vergleichen Sie die Python-Skripte im einheitlichen Format:

diff -u script_v1.py script_v2.py

Sie sollten eine Ausgabe ähnlich der folgenden sehen:

--- script_v1.py	2023-12-28 10:00:00.000000000 +0000
+++ script_v2.py	2023-12-28 10:05:00.000000000 +0000
@@ -1,8 +1,9 @@
 def greet(name):
-    print("Hello, " + name + "!")
+    print(f"Hello, {name.capitalize()}!")

 def main():
     name = input("Enter your name: ")
     greet(name)
+    print("Thank you for using this script!")

 if __name__ == "__main__":

Lassen Sie uns diese Ausgabe analysieren:

  • Die ersten beiden Zeilen zeigen die verglichenen Dateien und ihre Zeitstempel an.
  • Zeilen, die mit - beginnen, stammen aus der ersten Datei (script_v1.py).
  • Zeilen, die mit + beginnen, stammen aus der zweiten Datei (script_v2.py).
  • Zeilen ohne - oder + geben Kontextinformationen und sind zwischen den Dateien unverändert.
  • Die Zeile @@ -1,8 +1,9 @@ gibt an, dass wir die Zeilen 1 - 8 aus der ersten Datei und die Zeilen 1 - 9 aus der zweiten Datei sehen.

Dieses Format wird oft bevorzugt, da es mehr Kontext zu den Änderungen liefert.

Ignorieren von Leerzeichenänderungen

Manchmal sind Unterschiede in Leerzeichen (Leerzeichen, Tabulatoren) nicht von Bedeutung. Die Option -w teilt diff mit, diese Änderungen zu ignorieren.

Lassen Sie uns eine neue Version unseres Skripts mit einigen Leerzeichenänderungen erstellen:

Anmerkung: Sie müssen manuell einige Leerzeichen in das Skript einfügen. Das Kopieren und Einfügen des Codes enthält keine Leerzeichen.

cat > script_v3.py << EOF
def greet(name):
    print(f"Hello, {name.capitalize()}!")

def main():
    name = input("Enter your name: ")
    greet(name)
    print("Thank you for using this script!")

if __name__ == "__main__":
    main()
EOF

Nun vergleichen wir script_v2.py und script_v3.py, zunächst ohne und dann mit der Option -w:

diff script_v2.py script_v3.py

Sie könnten aufgrund von Leerzeichen einige Unterschiede sehen. Versuchen Sie nun:

diff -w script_v2.py script_v3.py

Sie sollten keine Ausgabe sehen, was bedeutet, dass es keine Unterschiede gibt, wenn Leerzeichen ignoriert werden.

Dies ist nützlich, wenn Sie sich auf Inhaltsänderungen statt auf Formatierungsunterschiede konzentrieren möchten.

Vergleich von Verzeichnissen

Der Befehl diff kann auch ganze Verzeichnisse vergleichen. Lassen Sie uns zwei Verzeichnisse mit einigen Dateien erstellen und sie vergleichen.

Erstellen Sie die Verzeichnisse und Dateien:

echo "This is a file in dir1" > dir1/file.txt
echo "This is a file in dir2" > dir2/file.txt
echo "This file is unique to dir1" > dir1/unique1.txt
echo "This file is unique to dir2" > dir2/unique2.txt

Nun vergleichen Sie die Verzeichnisse:

diff -r dir1 dir2

Sie sollten eine Ausgabe ähnlich der folgenden sehen:

Only in dir1: unique1.txt
Only in dir2: unique2.txt
diff -r dir1/file.txt dir2/file.txt
1c1
< This is a file in dir1
---
> This is a file in dir2

Diese Ausgabe sagt uns:

  1. dir1 enthält eine Datei namens unique1.txt, die in dir2 nicht existiert.
  2. dir2 enthält eine Datei namens unique2.txt, die in dir1 nicht existiert.
  3. Die Datei file.txt existiert in beiden Verzeichnissen, hat aber unterschiedlichen Inhalt.

Die Option -r lässt diff auch Unterverzeichnisse rekursiv vergleichen, was für den Vergleich komplexer Verzeichnisstrukturen nützlich ist.

Zusammenfassung

In diesem Lab haben wir den Linux-Befehl diff im Kontext der Softwareentwicklung untersucht. Wir haben gelernt, wie man:

  1. Zwei Textdateien vergleicht und die grundlegende diff-Ausgabe interpretiert
  2. Verschiedene Versionen von Python-Skripten vergleicht
  3. Das einheitliche Format für eine besser lesbare Ausgabe verwendet
  4. Leerzeichenänderungen bei Vergleichen ignoriert
  5. Ganze Verzeichnisse rekursiv vergleicht

Zusätzliche diff-Optionen, die in diesem Lab nicht behandelt wurden, sind:

  • -y: Vergleich nebeneinander (side-by-side comparison)
  • -i: Ignorieren von Groß- und Kleinschreibung (case differences)
  • -b: Ignorieren von Änderungen in der Anzahl der Leerzeichen
  • -B: Ignorieren von Änderungen, bei denen alle Zeilen leer sind
  • -q: Nur melden, wenn Dateien unterschiedlich sind, ohne die Unterschiede anzuzeigen

Diese Optionen können kombiniert werden, um genauere Vergleiche durchzuführen.