2016-07-03 8 views
1

Ich habe zwei Ordner von Dateien, die ich diff differieren möchte, außer ich möchte die erste Zeile in allen Dateien ignorieren. Ich versuchteDiff Dateien in zwei Ordnern ignorieren die erste Zeile

diff -Nr <(tail -n +1 folder1/) <(tail -n +1 folder2/) 

aber das ist eindeutig nicht der richtige Weg.

+1

Was eine rekursive Kopie der beiden Ordner mit 'cp -r' über die Herstellung und die Verwendung dann' -exec sed -i 1d finden {} \; 'die ersten Zeilen von den Kopien zu entfernen; Sie können dann normal 'diff -r' ausführen. – choroba

Antwort

2

Wenn die ersten Zeilen, die Sie ein unverwechselbares Format haben ignorieren möchten, die von einem POSIX regulären Ausdruck angepasst werden kann, dann können Sie diff ‚s --ignore-matching-lines=... Option verwenden, um es zu sagen zu ignorieren diese Zeilen.

Wenn dies nicht möglich ist, hängt die Vorgehensweise, die Sie treffen möchten, wahrscheinlich von Ihren genauen Anforderungen ab. Sie sagen, dass Sie die Dateien "differieren" möchten, aber es ist nicht offensichtlich, wie genau Ihre resultierende Ausgabe mit dem übereinstimmen muss, was Sie von diff -Nr erhalten würden, wenn sie diese Funktion unterstützt. (Zum Beispiel, müssen Sie die Zeilennummern in der diff die Zeilennummern in den Originaldateien korrekt identifizieren?)

Die eben treu Ansatz wahrscheinlich wie folgt wäre:

  • Kopieren jedes Verzeichnis ein neuer Standort mit cp --recursive ....
  • Bearbeiten Sie die erste Zeile jeder Datei, um eine magische Zeichenfolge wie IGNORE_THIS_LINE:: voranzustellen, mit etwas wie find -type f -exec sed -i '1 s/^/IGNORE_THIS_LINE::/' '{}' ';'.
  • Verwenden Sie diff -Nr --ignore-matching-lines=^IGNORE_THIS_LINE:: ..., um die Ergebnisse zu vergleichen.
    • Rohr den Ausgang sed s/IGNORE_THIS_LINE:://, um alle Vorkommen von IGNORE_THIS_LINE:: herauszufiltern, die zeigen, wie vor (innerhalb von einigen Zeilen von nicht-ignorierten Unterschiede werden).
2

Verwenden Prozessersetzung ist die richtige Methode zum Erstellen von Zwischen-Input-Dateideskriptoren. Aber tail funktioniert nicht auf Ordnern. Nur laufen alle Dateien im Ordner:

for f in folder1/*.txt; do 
    tail -n +2 $f | diff - <(tail -n +2 folder2/$(basename $f)) 
done 

Hinweis verwendet i +2 statt +1. tail Zeilennummerierung beginnt bei Zeile 1 nicht 0

Verwandte Themen