Alle Dateien eines Verzeichnisses mit einer anderen Datei vergleichen

A

abcdef

Grünschnabel
Hallo,

ich habe ein Verzeichnis, darin enthalten sind mehrere Dateien. Nun möchte ich alle Dateien (Parameter $1) gegen eine konstante Datei (Parameter $2) gegen vergleichen und die Unterschiede aufzeigen. Diese können dann am Ende einfach in einer Textdatei abgelegt werden.

Bisher habe ich
Code:
#!/bin/bash
for i in $1\*.txt
do cat $i $2| sort | uniq -d
done
exit 1
Soweit so gut. "for i in $1\*.txt do" nutze ich, um alle Textdateien vom Verzeichnis anzusprechen (da es auch nur um diese gehen soll). Mit dieser Variante kann ich aber nicht arbeiten, da er alle Dateien bei cat zusammenfasst und dann vergleicht. Die Dateien sollen aber alle separat behandelt werden. Ich hatte schon überlegt wie man jede Datei einzeln ansprechen kann bzw. wie man die Schleife ausbauen kann, komme aber auf keine Lösung.
 
Grundsätzlich gäbe es da mal diff, dass Dir Unterschiede zeigt. Was möchtest Du denn mit den Unterschieden machen, wenn Du sie hast?
 
Alle Treffer in eine seperate Datei schreiben. Also Datei 1 mit Datei X abgleichen und die Treffer (Gemeinsamkeiten) in Datei1_Treffer.txt speichern. Das gleiche mit Datei 2 und Datei X und so weiter. Datei X ist meine Konstante und wird mit allen Dateien 1-n in meinem Verzeichnis verglichen.
 
Code:
#!/bin/bash
feste_datei="$2"
ordner="$1"
for andere_datei in $ordner\*.txt
do cat $andere_datei $feste_datei| sort | uniq -d >${andere_datei}.gemeinsamkeiten
done
# Wieso exit 1?
exit 1
Damit stoße ich wieder auf das Ausgangsproblem: Die Dateien werden nicht separat gespeichert. Das Ergebnis ist EINE .gemeinsamkeiten-Datei (in diesem Fall wenn ich alle *.txt anspreche heißt diese *.txt.gemeinsamkeiten) wo alle Treffer der einzelnen Dateien abgelegt sind.

Das Problem ist hierbei nicht wie ich den Befehl aufsetze um die Dateien zu vergleichen. Vielmehr geht es darum alle separat zu behandeln - ohne feste Angabe wieviele Dateien nun im Verzeichnis abgelegt sind.
 
dann ersetze doch das Ziel der Ausgabeumleitung durch den entsprechenden Dateinamen - sprich die entsprechende Variable mit Suffix / Präfix /...

Ich würde trotzdem sagen - mit grep bekommst Du das Ergebnis einfacher...
 
Damit stoße ich wieder auf das Ausgangsproblem: Die Dateien werden nicht separat gespeichert. Das Ergebnis ist EINE .gemeinsamkeiten-Datei (in diesem Fall wenn ich alle *.txt anspreche heißt diese *.txt.gemeinsamkeiten) wo alle Treffer der einzelnen Dateien abgelegt sind.

Das Problem ist hierbei nicht wie ich den Befehl aufsetze um die Dateien zu vergleichen. Vielmehr geht es darum alle separat zu behandeln - ohne feste Angabe wieviele Dateien nun im Verzeichnis abgelegt sind.

Sorry, aber das sollte genau so sein wie Du es Dir wünscht. Wenn Du 4 Dateien hast, davon 3 im Ordner $ordner, dann hast Du nach dem Aufruf 3 weitere Dateien mit dem Namen der Datei in $ordner und der Endung .gemeinsamkeiten.

Ansonsten fällt mir da gerade etwas auf:

Code:
# Das ist falsch:

$ordner\*.txt

# Das ist richtig:

$ordner/*.txt

-------------

Ich habe Deinen Code mal interpretiert und ignoriert was Du gesagt hast. Dementsprechend war ich auf dem Holzweg. :)

Du willst eher so etwas:

Code:
#!/bin/bash

# Aufruf: dasprogram festedatei.txt *.txt

feste_datei="$1"
shift
vergleichs_dateien="$*"
for akt_vergleich in  $vergleichs_dateien; do
  cat $feste_datei $akt_vergleich | sort | uniq -d >${akt_vergleich}.gemeinsam
done

Bei obigem Vergleich vergleicht er festedatei.txt auch mit sich selbst, weil *.txt u. a. zu festedatei.txt aufgelöst wird. Das überlasse ich mal Dir das rauszufiltern.
 
Zuletzt bearbeitet:
Code:
grep -f ${referenzdatei} ${datei} > ${datei}_ref
Schleife drumrum, fertig.

Ihr könnt euch natürlich auch zu tode pipen und massiven Overhead generieren.
 

Ähnliche Themen

Prblem mit zeilenweises auslesen von Datei und schreiben nach mysql

Samba 4 Gast Zugang unter Ubuntu funktioniert nicht

dovecot und postfix Konfiguration Problem

Falsche Rechte gesetzt beim Anlegen von Ordnern via Samba-Client

Löschroutine mit Überprüfung

Zurück
Oben