3.3k Aufrufe
Gefragt in BS-Sonstige von
Hallo,

ich suche eine Möglichkeit mehrere Dateien, die den gleichen Namen tragen aber in unterschiedlichen Unterordnern liegen, aneinander zu hängen.

Folgende Dateien und Ordner sollen als Bsp dienen:
c:\ordner1\test1.txt
c:\ordner1\test2.txt
c:\ordner1\test3.txt
c:\ordner2\test1.txt
c:\ordner2\test3.txt
c:\ordner3\test1.txt
c:\ordner3\test5.txt
c:\resultate\

So kann man ja mit "c:\copy c:\ordner1\test1.txt + c:\ordner2\test1.txt + c:\ordner3\test1.txt c:\resultate\test1.txt"
die Dateien manuell zusammenführen. Das klappt ja bei wenigen Dateien auch wunderbar. Da ich aber Dateien von vielen Vereinsmitgliedern (über 250!) habe, die jeweils bis zu 5 verschiedene Textdateien mit jeweils gleichem Namen haben, ist das manuelle Zusammenfügen sehr sehr langwierig.
Darum die Frage, ob das auch automatischer geht. So dass man sagt, alle Dateien aus dem Ordern c:\test1 und c:\test2, die den gleichen Namen bitte zu einer Gesamtdatei unter c:\resultate zusammenfügen (wieder mit dem gleichen Namen natürlich, einfach hintereinander hängen reicht, egal in welcher Reihenfolge, der Inhalt der Dateien ist einfach Text)

sowas wie copy c:\ordner1\[allenamen] + c:\ordner2\[allenamen] c:\resultate\[allenamen] (is nur pseudo code von mir, geht so natürlich nicht)

Im obigen Beispiel soll dann unter c:\resultate Folgendes stehen:
c:\resultate\test1.txt (aus ordner1 und ordner2 und ordner3 zusammengefügt)
c:\resultate\test2.txt (aus ordner1)
c:\resultate\test3.txt (aus ordner1 und ordner2 zusammengefügt)
c:\resultate\test5.txt (aus ordner3)

Wenn es eine 'komplizierter' Lösung dazu gäbe, zB in Perl oder so schrecke ich davor nicht zurück, solange ich nicht selber Code dazu entwickeln muss (kann das nicht, sry)

Für jeden Tipp und Hilfe dankbar,
sollte ich meine Frage nicht gut genug erklärt haben, gerne fragen :) Wer Rechtschreibfähler findet, darf sie behalten ;)

Liebe Grüße,
Raffael

10 Antworten

0 Punkte
Beantwortet von rodi Mitglied (373 Punkte)
Hi,
versuche Dich doch mal an AutoIt.
Diese kleine aber feine Skriptsprache ist in etwas 10 bis 30 Minuten zu lernen und macht solche kleinen Aufgaben mit Bravour.
Ich persönlich steuere damit zum Beispiel meine Sysprep Installationen meiner Laborrechner.
Unter Linux wäre das übrigens ein Einzeiler. :P
Viele Grüsse,
Rodi
0 Punkte
Beantwortet von
danke schon mal, ich schaue mir den Link gleich an.

WIe sähe denn dieser Einzeiler unter Linux aus? Ich lerne immer gerne dazu :)

Raffael
0 Punkte
Beantwortet von rodi Mitglied (373 Punkte)
Hi.
Unter Linux würde folgender Befehl in allen Unterwerzeichnissen nach der Datei "test.txt" suchen und den Inhalt hintereinander in eine Datei "datei.txt" schreiben.
find -name test.txt -exec cat {} > datei.txt \;

Getestet mit OpenSuse 11.1. Es geht vielleicht noch eleganter, aber dieser Einzeiler hat den Job gemacht. Mit Pipes und weiteren exec Parametern kann man da noch einiges mehr schrauben. ;)

Gruß @all,
Rodi
0 Punkte
Beantwortet von
Hallo,

lieben Dank schon mal für diese Antwort.

Mit diesem Befehl würde ich EINE Datei zusammenfügen. Wie könnte ich darüber hinaus ALLE Dateien aus dem ersten Ordner mit den Dateien aus dem zweiten Ordner wie schon im ersten Post beschrieben zusammenfügen?
0 Punkte
Beantwortet von
Also ALLE, ohne dass ich natürlich alle 250 Namen von Hand dabei eintippen muss, sondern dass automatisch alle Dateien aus Ordner1 genommen werden mit allen Dateien gleichen Namens aus Ordner2 zusammen gefügt werden!
0 Punkte
Beantwortet von rodi Mitglied (373 Punkte)
Hi,
Sorry, da habe ich den ersten Post nicht richtig gelesen und verstanden. Das muss dann auf jeden Fall als Skript zusammen gefasst werden. Unter Linux bin ich mit Skripten noch nicht sooo vertraut. Unter AutoIt müsste man da einen Suchalgorithmus programmieren. Wenn die Dateien einfach einen Zähler haben und vorne alle gleich heissen kann man einfach den Zähler hochsetzen. Wenn es verschiedene Dateinamen sind wird das schon aufwendiger. Technisch aber machbar. So etwas ähnliches habe ich mit AutoIt schon programmiert.
Ich werde Dir hier jetzt aber kein fertiges Programm hinstellen. AutoIt lernen dauert nicht lange, so ein Skript schreiben dauert aber schon ein bisschen.
Gruß,
Rodi
0 Punkte
Beantwortet von luke_filewalker Experte (3.3k Punkte)
Schliesse mich Rodi an. Ausserdem ist AI3 ist ein perfekter Ersatz für z.B. Batch-Hampelei. Wobei vermutlich auch diese Aufgabe mit Batch gelöst werden könnte, aber reichlich umständlich. Allerdings AI3 nur als Ersatz für Batch zu deklarieren wäre schon fast Blasphemie. AI3 ist in der Tat sehr einfach zu lernen, allerdings kaum in 10-30 Minuten, das gilt höchstens für einen routinierten Programmierer. ;-)

Mein Ansatz wäre exakt der gleiche wie der von Rodi. Zuerst braucht es eine Routine die alle Dateinamen bzw. Pfade aller zu berücksichtigenden Dateien ermittelt. Als nächstes eine Routine die dann diese Liste der Reihe nach abarbeitet.

So wie Du das im Beispiel darstellst, sind die betreffenden Ordner direkt im Root. Für eine mögliche Lösung wäre es jedoch bedeutend einfacher, wenn diese Unterordner nochmal in einem Hauptordner wären. Denn so wie im Beispiel wäre die Suchroutine unnötig umständlich, da ja sicher nicht alle Unterordner im Root berücksichtigt werden sollen.
0 Punkte
Beantwortet von
Hei,

ich könnte wetten, das geht super einfach mit einem Linux-Script zu erledigen. Stell doch mal die Frage hierher: debianforum.de/forum/viewforum.php?f=34&start=0. Mir konnte da schon oft geholfen werden. Ich bin zwar auch noch nicht so bewandert, könnte es mir aber auch so ähnlich vorstellen wie A3.

find /ordner1 -type f -name * -exec "ab hier keine Ahnung"

Oder auch eine Schleife. Dann wirds ein 4 Zeiler. Das läuft alles auch ohne Perl. Da bin ich mir sicher. Habe zwar keine Lösung so schnell, aber hoffentlich hilft meine Anregung etwas.

Viel Glück
0 Punkte
Beantwortet von rahi Experte (1.5k Punkte)
Hallo Raphael,

mit deinem copy (xcopy) - Befehl ist die erste Hürde genommen. Ich habe diesen Befehl in eine VBS-Datei (ja das gibt's noch) gepackt und eine Prozedur darum gestrickt, die rekursiv alle Verzeichnisse öffnet und die Dateien in deinem Zielverzeichnis an den gleichen Dateinamen anhängt. Du musst nur die zwei Pfadangaben in der dritten Zeile an deine Umgebung anpassen.

Set fs = CreateObject("Scripting.FileSystemObject")
Set wshShell = CreateObject("WScript.Shell")
folderadd wshShell, fs, "D:\Projekte\Supportnet\Filetest", "D:\Projekte\Supportnet\des"

Public Sub folderadd(wshShell , fs , p , destination)
Set fd = fs.GetFolder(p)
For Each f In fd.files
s = "cmd.exe /c " & "TYPE " & destination & "\" & f.Name & " + " & f.Path & " >> " & destination & "\" & f.Name
wshShell.Run s
Next
For Each x In fd.SubFolders
folderadd wshShell, fs, x.Path, destination
Next
End Sub

Diesen Code kopierst du in eine Textdatei (Bsp. "concatCopy.vbs") mit der Endung .vbs und legst sie auf den Desktop. Von da aus kannst du sie dann bequem starten.
Ich habe keine Fehlerroutinen drin, die Pfade sollten also existieren. Es soll ja auch nur ein Ansatz sein. In den Quellverzeichnissen sollten natürlich nur Textdateien o.a. stehen, denn die Routine kopiert alles zusammen.
Hast du dir so was gedacht?

Gruß
Ralf

p.s. Getestet unter Windows7 64Bit
0 Punkte
Beantwortet von
Vielen, vielen Dank,

genau an so etwas habe ich gedacht. Sieht auf jeden Fall genau nach dem aus, was ich suche! Muss es nur noch testen. Schonmal tausend Danke, dass du dir die Arbeit gemacht hast. Super Super.

Raffael
...