Πώς να συγκρίνετε δύο αρχεία κειμένου στο τερματικό Linux

Θέλετε να δείτε τις διαφορές μεταξύ δύο αναθεωρήσεων ενός αρχείου κειμένου; Τότε το diff είναι η εντολή που χρειάζεστε. Αυτό το σεμινάριο σάς δείχνει πώς να χρησιμοποιείτε το diff σε Linux και macOS, με τον εύκολο τρόπο.

Βουτιά στο διαφορ

Η εντολή diff συγκρίνει δύο αρχεία και παράγει μια λίστα με τις διαφορές μεταξύ των δύο. Για να είμαστε πιο ακριβείς, παράγει μια λίστα με τις αλλαγές που θα έπρεπε να γίνουν στο πρώτο αρχείο, για να ταιριάζει με το δεύτερο αρχείο. Εάν το έχετε υπόψη σας, θα είναι πιο εύκολο να κατανοήσετε την έξοδο από το diff. Η εντολή diff σχεδιάστηκε για να βρίσκει διαφορές μεταξύ των αρχείων πηγαίου κώδικα και να παράγει μια έξοδο που θα μπορούσε να διαβαστεί και να εφαρμοστεί από άλλα προγράμματα, όπως το κηλίδα εντολή. Σε αυτό το σεμινάριο, θα εξετάσουμε τους πιο χρήσιμους φιλικούς προς τον άνθρωπο τρόπους χρήσης του διαφορικού.

Ας βουτήξουμε αμέσως και ας αναλύσουμε δύο αρχεία. Η σειρά των αρχείων στη γραμμή εντολών καθορίζει ποιο αρχείο diff θεωρεί ότι είναι το “πρώτο αρχείο” και ποιο θεωρεί ότι είναι το “δεύτερο αρχείο”. Στο παρακάτω παράδειγμα, το alpha1 είναι το πρώτο αρχείο και το alpha2 είναι το δεύτερο αρχείο. Και τα δύο αρχεία περιέχουν το φωνητικό αλφάβητο αλλά το δεύτερο αρχείο, το alpha2, είχε κάποια περαιτέρω επεξεργασία, έτσι ώστε τα δύο αρχεία να μην είναι πανομοιότυπα.

Μπορούμε να συγκρίνουμε τα αρχεία με αυτήν την εντολή. Πληκτρολογήστε diff, ένα διάστημα, το όνομα του πρώτου αρχείου, ένα διάστημα, το όνομα του δεύτερου αρχείου και, στη συνέχεια, πατήστε Enter.

diff alpha1 alpha2

Πώς αναλύουμε αυτό το αποτέλεσμα; Μόλις ξέρετε τι να ψάξετε, δεν είναι τόσο κακό. Κάθε διαφορά παρατίθεται με τη σειρά σε μια στήλη και κάθε διαφορά επισημαίνεται. Η ετικέτα περιέχει αριθμούς και στις δύο πλευρές ενός γράμματος, όπως το 4c4. Ο πρώτος αριθμός είναι ο αριθμός γραμμής στο alpha1 και ο δεύτερος αριθμός είναι ο αριθμός γραμμής στο alpha2. Το γράμμα στη μέση μπορεί να είναι:

γ: Η γραμμή στο πρώτο αρχείο πρέπει να αλλάξει για να ταιριάζει με τη γραμμή στο δεύτερο αρχείο.
δ: Η γραμμή στο πρώτο αρχείο πρέπει να διαγραφεί για να ταιριάζει με το δεύτερο αρχείο.
α: Πρέπει να προστεθεί επιπλέον περιεχόμενο στο πρώτο αρχείο για να ταιριάζει με το δεύτερο αρχείο.

Το 4c4 στο παράδειγμά μας μας λέει ότι η γραμμή τέσσερα του alpha1 πρέπει να αλλάξει για να ταιριάζει με τη γραμμή τέσσερα του alpha2. Αυτή είναι η πρώτη διαφορά μεταξύ των δύο αρχείων που διαφέρουν που βρέθηκαν.

Οι γραμμές που ξεκινούν με αναφέρονται στο δεύτερο αρχείο, το alpha2. Η γραμμή Dave μας λέει ότι η λέξη Dave είναι το περιεχόμενο της γραμμής τέσσερα στο alpha2. Για να συνοψίσουμε στη συνέχεια, πρέπει να αντικαταστήσουμε το Delta με το Dave στη γραμμή τέσσερα στο alpha1, για να ταιριάζει αυτή η γραμμή και στα δύο αρχεία.

  Πώς να ρυθμίσετε το Regolith Linux 1.6

Η επόμενη αλλαγή υποδεικνύεται από το 12c12. Εφαρμόζοντας την ίδια λογική, αυτό μας λέει ότι η γραμμή 12 στο alpha1 περιέχει τη λέξη Lima, αλλά η γραμμή 12 του alpha2 περιέχει τη λέξη Linux.

Η τρίτη αλλαγή αναφέρεται σε μια γραμμή που έχει διαγραφεί από το alpha2. Η ετικέτα 21d20 αποκρυπτογραφείται ως «η γραμμή 21 πρέπει να διαγραφεί από το πρώτο αρχείο για να συγχρονιστούν και τα δύο αρχεία από τη γραμμή 20 και μετά». ο

Η τέταρτη διαφορά φέρει την ένδειξη 26a26,28. Αυτή η αλλαγή αναφέρεται σε τρεις επιπλέον γραμμές που έχουν προστεθεί στο alpha2. Σημειώστε το 26,28 στην ετικέτα. Οι αριθμοί δύο γραμμών που χωρίζονται με κόμμα αντιπροσωπεύουν ένα εύρος αριθμών γραμμής. Σε αυτό το παράδειγμα, το εύρος είναι από τη γραμμή 26 έως τη γραμμή 28. Η ετικέτα ερμηνεύεται ως “στη γραμμή 26 του πρώτου αρχείου, προσθέστε τις γραμμές 26 έως 28 από το δεύτερο αρχείο.” Εμφανίζονται οι τρεις γραμμές στο alpha2 που πρέπει να προστεθούν στο alpha1. Αυτά περιέχουν τις λέξεις Quirk, Strange και Charm.

Snappy One-Liners

Εάν το μόνο που θέλετε να μάθετε είναι αν δύο αρχεία είναι ίδια, χρησιμοποιήστε την επιλογή -s (αναφορά πανομοιότυπων αρχείων).

diff -s alpha1 alpha3

Μπορείτε να χρησιμοποιήσετε την επιλογή -q (σύντομη) για να πάρετε μια εξίσου συνοπτική δήλωση σχετικά με δύο αρχεία που είναι διαφορετικά.

diff -q alpha1 alpha2

Ένα πράγμα που πρέπει να προσέξετε είναι ότι με δύο πανομοιότυπα αρχεία η επιλογή-q (σύντομη) συγκεντρώνεται πλήρως και δεν αναφέρει απολύτως τίποτα.

Μια εναλλακτική άποψη

Η επιλογή -y (side by side) χρησιμοποιεί διαφορετική διάταξη για να περιγράψει τις διαφορές των αρχείων. Είναι συχνά βολικό να χρησιμοποιείτε την επιλογή -W (πλάτος) με πλάγια όψη, για να περιορίσετε τον αριθμό των στηλών που εμφανίζονται. Με αυτόν τον τρόπο αποφεύγονται οι άσχημες γραμμές που περιτυλίγονται που κάνουν το αποτέλεσμα δύσκολο να διαβαστεί. Εδώ είπαμε στο diff να παράγει μια οθόνη δίπλα-δίπλα και να περιορίσει την έξοδο σε 70 στήλες.

diff -y -W 70 alpha1 alpha2

Το πρώτο αρχείο στη γραμμή εντολών, alpha1, εμφανίζεται στα αριστερά και η δεύτερη γραμμή στη γραμμή εντολών, alpha2, εμφανίζεται στα δεξιά. Οι γραμμές από κάθε αρχείο εμφανίζονται δίπλα δίπλα. Υπάρχουν χαρακτήρες ένδειξης δίπλα σε αυτές τις γραμμές στο alpha2 που έχουν αλλάξει, διαγραφεί ή προστεθεί.

|: Μια γραμμή που έχει αλλάξει στο δεύτερο αρχείο.
<: a="" line="" that="" has="" been="" deleted="" from="" the="" second="" file.="">: Μια γραμμή που έχει προστεθεί στο δεύτερο αρχείο που δεν βρίσκεται στο πρώτο αρχείο.

Εάν προτιμάτε μια πιο συμπαγή παράπλευρη περίληψη των διαφορών των αρχείων, χρησιμοποιήστε την επιλογή –suppress-common-lines. Αυτό αναγκάζει τη διαφορά για τη λίστα μόνο των αλλαγμένων, προστιθέμενων ή διαγραμμένων γραμμών.

diff -y -W 70 --suppress-common-lines alpha1 alpha2

Προσθέστε μια πιτσιλιά χρώματος

Ένα άλλο βοηθητικό πρόγραμμα που ονομάζεται colordiff προσθέτει χρωματική επισήμανση στην έξοδο της διαφοράς. Αυτό καθιστά πολύ πιο εύκολο να δείτε ποιες γραμμές έχουν διαφορές.

Χρησιμοποιήστε το apt-get για να εγκαταστήσετε αυτό το πακέτο στο σύστημά σας εάν χρησιμοποιείτε Ubuntu ή άλλη διανομή που βασίζεται στο Debian. Σε άλλες διανομές Linux, χρησιμοποιήστε αντί αυτού το εργαλείο διαχείρισης πακέτων της διανομής σας Linux.

sudo apt-get install colordiff

Χρησιμοποιήστε το colordiff όπως ακριβώς θα χρησιμοποιούσατε το diff.

  Πώς να κατεβάσετε και να εγκαταστήσετε εύκολα εφαρμογές σε Linux με το AppImage Pool

Στην πραγματικότητα, το colordiff είναι ένα περιτύλιγμα για το diff, και το diff κάνει όλη τη δουλειά στα παρασκήνια. Εξαιτίας αυτού, όλες οι επιλογές διαφορών θα λειτουργούν με το colordiff.

Παροχή κάποιου πλαισίου

Για να βρούμε κάποια μέση λύση μεταξύ της εμφάνισης όλων των γραμμών στα αρχεία στην οθόνη και της εμφάνισης μόνο των αλλαγμένων γραμμών, μπορούμε να ζητήσουμε από το diff να παρέχει κάποιο πλαίσιο. Υπάρχουν δύο τρόποι για να γίνει αυτό. Και οι δύο τρόποι επιτυγχάνουν τον ίδιο σκοπό, που είναι να εμφανιστούν μερικές γραμμές πριν και μετά από κάθε αλλαγή γραμμής. Θα μπορείτε να δείτε τι συμβαίνει στο αρχείο στο σημείο όπου εντοπίστηκε η διαφορά.

Η πρώτη μέθοδος χρησιμοποιεί την επιλογή -c (αντιγραμμένο περιβάλλον).

colordiff -c alpha1 alpha2

Η έξοδος diff έχει μια κεφαλίδα. Η κεφαλίδα παραθέτει τα δύο ονόματα αρχείων και τους χρόνους τροποποίησης τους. Υπάρχουν αστερίσκοι

πριν από το όνομα του πρώτου αρχείου και παύλες (-) πριν από το όνομα του δεύτερου αρχείου. Οι αστερίσκοι και οι παύλες θα χρησιμοποιηθούν για να υποδείξουν σε ποιο αρχείο ανήκουν οι γραμμές στην έξοδο.

Μια γραμμή αστερίσκων με 1,7 στη μέση δείχνει ότι κοιτάμε γραμμές από το alpha1. Για την ακρίβεια, εξετάζουμε τις γραμμές ένα έως επτά. Η λέξη Delta επισημαίνεται ως αλλαγμένη. Έχει δίπλα του ένα θαυμαστικό ( ! ) και είναι κόκκινο. Υπάρχουν τρεις γραμμές αμετάβλητου κειμένου που εμφανίζονται πριν και μετά από αυτήν τη γραμμή, ώστε να μπορούμε να δούμε το περιβάλλον αυτής της γραμμής στο αρχείο.

Η γραμμή των παύλων με το 1,7 στη μέση μας λέει ότι τώρα κοιτάμε γραμμές από το alpha2. Και πάλι, εξετάζουμε τις γραμμές ένα έως επτά, με τη λέξη Dave στη γραμμή τέσσερα να επισημαίνεται ως διαφορετική.

colordiff -C 2 alpha1 alpha2

Τρεις γραμμές περιβάλλοντος πάνω και κάτω από κάθε αλλαγή είναι η προεπιλεγμένη τιμή. Μπορείτε να καθορίσετε πόσες γραμμές περιβάλλοντος θέλετε να παρέχει το διαφορετικό. Για να το κάνετε αυτό, χρησιμοποιήστε την επιλογή -C (αντιγραμμένο περιβάλλον) με κεφαλαίο “C” και καταχωρίστε τον αριθμό των γραμμών που θέλετε:

colordiff -u alpha1 alpha2

Η δεύτερη επιλογή διαφοράς που προσφέρει το πλαίσιο είναι η επιλογή -u (ενοποιημένο πλαίσιο).

Όπως και πριν, έχουμε μια κεφαλίδα στην έξοδο. Τα δύο αρχεία ονομάζονται και εμφανίζονται οι χρόνοι τροποποίησης τους. Υπάρχουν παύλες (-) πριν από το όνομα του alpha1 και πρόσημα συν (+) πριν από το όνομα του alpha2. Αυτό μας λέει ότι οι παύλες θα χρησιμοποιηθούν για να αναφέρονται στο άλφα1 και τα σύμβολα συν θα χρησιμοποιηθούν για να αναφέρονται στο άλφα2. Διάσπαρτες σε όλη την καταχώριση υπάρχουν γραμμές που ξεκινούν με τα σημάδια (@). Αυτές οι γραμμές σηματοδοτούν την αρχή κάθε διαφοράς. Μας λένε επίσης ποιες γραμμές εμφανίζονται από κάθε αρχείο.

Εμφανίζονται οι τρεις γραμμές πριν και μετά τη γραμμή που έχει επισημανθεί ως διαφορετικές, ώστε να μπορούμε να δούμε το πλαίσιο της αλλαγής γραμμής. Στην ενοποιημένη προβολή, οι γραμμές με τη διαφορά εμφανίζονται η μία πάνω από την άλλη. Η γραμμή από το alpha1 προηγείται από μια παύλα και η γραμμή από το alpha2 προηγείται ένα σύμβολο συν. Αυτή η οθόνη επιτυγχάνει σε οκτώ γραμμές αυτό που χρειάστηκαν δεκαπέντε για να κάνει η παραπάνω αντιγραμμένη προβολή περιβάλλοντος.

colordiff -U 2 alpha1 alpha2

Όπως θα περίμενε κανείς, μπορούμε να ζητήσουμε από το diff να παρέχει ακριβώς τον αριθμό των γραμμών ενοποιημένου περιβάλλοντος που θα θέλαμε να δούμε. Για να το κάνετε αυτό, χρησιμοποιήστε την επιλογή -U (ενοποιημένο πλαίσιο) με κεφαλαίο “U” και δώστε τον αριθμό των γραμμών που θέλετε:

Αγνοώντας το White Space and Case

colordiff -y -W 70 test4 test5

Ας αναλύσουμε άλλα δύο αρχεία, το test4 και το test5. Αυτά έχουν μέσα τα ονόματα έξι υπερηρώων.

  Πώς να κάνετε το τερματικό Linux φιλικό προς το χρήστη με το ColorLS

Τα αποτελέσματα δείχνουν ότι η διαφορά δεν βρίσκει τίποτα διαφορετικό με τις γραμμές Black Widow, Spider-Man και Thor. Επισημαίνει αλλαγές με τις γραμμές Captain America, Ironman και The Hulk.

Τι διαφορετικό λοιπόν; Λοιπόν, στο test5 ο Hulk γράφεται με πεζό “h” και ο Captain America έχει ένα επιπλέον διάστημα μεταξύ “Captain” και “America”. Εντάξει, αυτό είναι ξεκάθαρο, αλλά τι συμβαίνει με τη σειρά Ironman; Δεν υπάρχουν ορατές διαφορές. Εδώ είναι ένας καλός εμπειρικός κανόνας. Εάν δεν μπορείτε να το δείτε, η απάντηση είναι το κενό διάστημα. Υπάρχει σχεδόν σίγουρα ένα αδέσποτο διάστημα ή δύο, ή ένας χαρακτήρας καρτέλας, στο τέλος αυτής της γραμμής.

Εάν δεν έχουν σημασία για εσάς, μπορείτε να δώσετε εντολή στο diff να αγνοήσει συγκεκριμένους τύπους διαφοράς γραμμής, όπως:
-i: Αγνοήστε τις διαφορές στην περίπτωση.
-Ζ: Αγνοήστε το λευκό κενό.
-b: Αγνοήστε τις αλλαγές στην ποσότητα του λευκού χώρου.

-w: Αγνοήστε όλες τις αλλαγές λευκού διαστήματος.

colordiff -i -y -W 70 test4 test5

Ας ζητήσουμε από το diff να ελέγξει ξανά αυτά τα δύο αρχεία, αλλά αυτή τη φορά για να αγνοήσει τυχόν διαφορές σε περίπτωση.

colordiff -i -Z -y -W 70 test4 test5

Οι γραμμές με “The Hulk” και “The Hulk” θεωρούνται πλέον ως ταίριασμα και καμία διαφορά δεν επισημαίνεται με πεζά “h”. Ας ζητήσουμε από το diff να αγνοήσει επίσης το κενό διάστημα.

colordiff -i -w -y -W 70 test4 test5

Όπως υποψιαζόμαστε, το τελευταίο λευκό διάστημα πρέπει να ήταν η διαφορά στη γραμμή Ironman επειδή το diff δεν επισημαίνει πλέον μια διαφορά για αυτήν τη γραμμή. Αυτό αφήνει τον Captain America. Ας ζητήσουμε από το diff να αγνοήσει τα πεζά και να αγνοήσει όλα τα ζητήματα του λευκού χώρου.

Λέγοντας στο diff να αγνοήσει τις διαφορές που δεν μας απασχολούν, το diff μας λέει ότι, για τους σκοπούς μας, τα αρχεία ταιριάζουν. Η εντολή diff έχει πολλές περισσότερες επιλογές, αλλά οι περισσότερες από αυτές σχετίζονται με την παραγωγή αναγνώσιμων από μηχανή εξόδου. Αυτά μπορούν να αναθεωρηθούν στο Linuxσελίδα ανθρώπου

. Οι επιλογές που χρησιμοποιήσαμε στα παραπάνω παραδείγματα θα σας επιτρέψουν να εντοπίσετε όλες τις διαφορές μεταξύ των εκδόσεων των αρχείων κειμένου σας, χρησιμοποιώντας τη γραμμή εντολών και τα ανθρώπινα μάτια.