2017-07-14 12 views
1

Ähnliche Beiträge hier:vergleichen Recursively bestimmte Dateien in verschiedenen Verzeichnissen

Diff files present in two different directories

und hier:

https://superuser.com/q/602877/520666

aber nicht ganz das, was ich suche.

Ich habe 2 Verzeichnisse (enthält Unterverzeichnisse und verschiedene Dateitypen - Binär, Bilder, HTML, etc.).

Ich möchte in der Lage sein, rekursiv Dateien mit bestimmten Erweiterungen (z. B. .html, .strings usw.) zwischen den beiden Verzeichnissen zu vergleichen - sie können oder können nicht in einem der beiden (Unter) Verzeichnisse existieren.

Wie kann ich das erreichen? Diff scheint Ausschlüsse nur zu unterstützen, und ich bin mir nicht sicher, wie ich Find dafür nutzen kann.

Beratung?

Antwort

0

Sie könnten alle unerwünschten fileendings mit find auszuschließen:

(diese Version entspricht nur gegen Dateiendungen)

diff -r -x `find . -type f -name '*.*' | sed 's|.*\.|.*\.|' | sort -u | grep -v YOURFILETYPE | paste -sd "|"` ...rest of diff command 

Oder Sie erzeugen die Liste der ausgeschlossenen Dateien im Voraus und auf den diff passieren:

(diese Version passt auch gegen Dateinamen und alle anderen regex Sie in include.file angeben)

find /dirA -type f | grep -v YOURFILEENDING > exclude.list 
find /dirB -type f | grep -v YOURFILEENDING >> exclude.list 
diff -X exclude.list -r /dirA /dirB 

Wenn Sie diese Befehle über && Kette finden Sie eine handliche oneliner bekommen;)


MIT DATEI

Wenn Sie eine Include-Datei verwenden möchten, können Sie diese Methode verwenden:

  1. Sie geben die Include-Datei
  2. grep Spiele gegen alle Dateien in den Ordnern und verwandelt Ihren inkl udefile in eine Ausschlussdatei für diff (diff dauert nur Dateien ausschließen)

Hier ist ein Beispiel:

Komplizierte Inline-Version:

(diese Version entspricht nur gegen Dateiendungen)

diff -r -x `find . -type f -name '*.*' | sed 's|.*\.|.*\.|' sort -u | grep -v -f include.file | paste -sd "|"` /dirA /dirB 

Etwas längere einfachere Version:

(diese Version passt auch auf den Dateinamen s und jede andere Regex, die Sie in include.file angeben)

find /dirA -type f | grep -v -f include.file > exclude.list 
find /dirB -type f | grep -v -f include.file >> exclude.list 
diff -X exclude.list -r /dirA /dirB 

mit jeder Zeile enthalten.Datei ein grep regex/Ausdruck ist:

log 
txt 
fileending3 
whateverfileendingyoulilke 
fullfilename.txt 
someotherregex.* 

HINWEIS

ich nicht diese laufen hätte, weil ich nirgendwo in der Nähe von einem Computer bin. Ich hoffe, ich habe alle Syntax korrekt.

+0

Ich mag diese Idee, aber wie könnte ich eine invertierte Methode verwenden und nur Diff gegen eine "include.list"? – vmoralito

+0

@vmoralito Ich habe gerade meinen Beitrag aktualisiert und eine Methode entwickelt, um dynamisch eine Ausschlussdatei aus einer Include-Datei zu erzeugen, da diff nur die Ausschlussdatei akzeptiert. Mit dem obigen Verfahren können Sie jedoch Ihre Include-Datei verwenden. –

0

Die einfachste, was man tun kann, ist die ganze Verzeichnisse vergleichen:

diff -r /path/the/first /path/the/second 

Es wird sich zeigen, welche Dateien sind nur in einem der Verzeichnisse, die Dateien in binärer Weise unterscheiden, und die volle diff für Textdateien in beiden Verzeichnissen.

Sie können Schleife über einen Satz von relative Pfade indem Sie einfach eine Datei mit einem Pfad pro Zeile lesen thusly:

while IFS= read -u 9 relative_path 
do 
    diff "/path/the/first/%{relative_path}" "/path/the/second/%{relative_path}" 
done 9< relative_paths.txt 

tun dies für einen bestimmten Satz von Erweiterungen ist ähnlich einfach:

shopt -s globstar 
while IFS= read -u 9 extension do 
    diff "/path/the/first/"**/*."${extension}" "/path/the/second/"**/*."${extension}" 
done 9< extensions.txt 
+0

Dies wurde bereits in den Posts in der Frage abgedeckt. Leider gibt es mehr als 2600+ Dateien in jedem "Eltern" -Verzeichnis, und viele davon werden Änderungen enthalten, die mir egal sind. Ich bin nur an den Änderungen für die spezifischen Dateien interessiert, um die ich mich kümmern muss. Ich werde weiter herumstochern. – vmoralito

Verwandte Themen