intreater
Goto Top

Dateien in Verzeichnisstruktur finden (nach Dateiinhalt suchen), diese verschieben und umbenennen

Hallo zusammen!

Folgendes Problem beschäftigt mich. Da ich (noch) kein großer batch-Master bin hoffe ich auf eure Hilfe.

Gegeben:
eine Datei- / Verzeichnisstruktur, die wie folgt aussieht
\root\GruppeA\BenutzerA_1\pd50000000006.txt
\root\GruppeA\BenutzerA_1\pd50000000018.txt
\root\GruppeA\BenutzerA_1\pd50000000026.txt
\root\GruppeA\BenutzerA_2\pd50000000001.txt
\root\GruppeA\BenutzerA_2\pd50000000002.txt
\root\GruppeA\BenutzerA_2\pd50000000003.txt
\root\GruppeB\BenutzerB_1\pd50000000001.txt
\root\GruppeC\BenutzerC_6\pd50000000018.txt
usw.

Wie man sieht, kann es sein, daß eine Datei mit gleichem Namen in mehreren (Unter-)Verzeichnissen vorkommt.

Was passieren soll:
1.) durchsuche alle Dateien in allen Unterverzeichnissen ab \root\ nach einem String XXX
Ergänzung:
- ich müsste auch nach mehreren Wörtern suchen können und NUR wenn ALLE gefunden werden weiter zu 2.)
- ich müsste auch nach sowas suchen können: ABCxxxx19098 (wobei xxxx unbekannt ist; mir hilft aber nicht eine verknüpfte Suche
à la - finde ABC & finde 19098 -. Es muss wirklich finde ABC[4-freilassen]19098. Die Länge des Suchbegriffs ist immer
gleich und bekannt (wie hier: Gesamtlänge 12, ersten 3 Stellen und letzten 5 Stellen kannt).

2.) verschiebe jede Datei, die gefunden wird nach \root2\Found_StringXXX
ABER: nummeriere die Dateien neu durch beim Verschieben (fange an mit der ersten Datei bei pd0000000001.txt und addiere
immer eins auf). Hier müsste das Skript also vorher in das Verzeichnis Found_StringXXX schauen, sich die letzte Nummer holen und diese dann mit +1 zur Fortnummerierung der nächstkommenden Dateien verwenden.


Ist so etwas mit "einfachen" Bordmitteln zu bewerkstelligen?
Das ganze soll als wiederkehrender Task auf einem Server abgearbeitet werden.


Für ein paar klärende Worte wäre ich überaus dankbar.


Viele Grüße,

Markus.

Content-ID: 40266

Url: https://administrator.de/contentid/40266

Ausgedruckt am: 27.11.2024 um 01:11 Uhr

bastla
bastla 16.09.2006 um 19:26:48 Uhr
Goto Top
Hallo Markus!

Ein erster (schematischer) Ansatz für Teil 1 zur Erzeugung einer Liste aller passenden Dateien:

cd /d LW:\root
REM Nur dem Dateinamensschema entsprechende Dateien mit enthaltenem "ErsterSuchstring"  
REM suchen und in einer Temporärdatei zwischenspeichern
findstr /S /M "ErsterSuchstring" ABC????19098.txt > Temp1.txt  
REM Nur die in der Temporärdatei angeführten Dateien nach "ZweiterSuchstring" durchsuchen  
REM und die gefundenen Dateien wieder in eine Temporärdatei schreiben usf.
findstr /M /F:Temp1.txt "ZweiterSuchstring" > Temp2.txt  
.
.
.
REM Entsprechend dem letzten Suchstring die endgültige Dateiliste erzeugen
findstr /M /F:Temp5.txt "LetzterSuchstring" > FileList.txt  

"ErsterSuchstring", "ZweiterSuchstring", ... sind, falls du mit "XXX" einen String aus mehreren Wörtern gemeint hast, die einzelnen Wörter (nicht notwendigerweise in der in "XXX" angegebenen Reihenfolge).


Für Teil 2 die entstandene Dateiliste "FileList.txt" dann zB per VBScript (wegen der Nummerierung) weiter verarbeiten ...


HTH
bastla
bastla
bastla 16.09.2006 um 21:22:43 Uhr
Goto Top
Mögliche Fortsetzung:

FileListPath = "Z:\root\FileList.txt"  

TargetPath = "Z:\root2\Found" & _  
	"_" & "ErsterSuchbegriff" & _  
	"_" & "ZweiterSuchbegriff" & _  
	"_" & "LetzterSuchbegriff\"  

Set fso = Wscript.CreateObject("Scripting.FileSystemObject")  

'Gegebenen Falls Zielpfad erstellen  
If Not fso.FolderExists(TargetPath) Then fso.CreateFolder(TargetPath)
Set CurrentFolder = fso.GetFolder(TargetPath)

MaxNum = 0

For Each Datei In CurrentFolder.Files
	'Laufende Dateinummer fünfstellig (auf "pd500000" folgend)  
	Num = CInt(Mid(Datei.Name,9,5))
	If Num > MaxNum Then MaxNum = Num
Next

FileNum = MaxNum + 1

Set FileList = fso.OpenTextFile(FileListPath, 1)

Do While Not FileList.AtEndOfStream
	OldFile = FileList.ReadLine
	NewFile = TargetPath & "pd500000" & Right("00000" & CStr(FileNum), 5) & ".txt"  
	fso.MoveFile OldFile, NewFile
	FileNum = FileNum + 1
Loop

FileList.Close
Set FileList = Nothing
Set fso = Nothing


Pfade, Suchbegriffe und Dateinamen habe ich zu Testzwecken zunächst fest verdrahtet; in einer Endfassung wären zumindest die Suchbegriffe beim Aufruf des Scripts aus der Batch-Datei als Argumente zu übergeben (dito natürlich bereits der Batch-Datei selbst - für die Biber vielleicht noch eine ordentliche Lösung nachreichen könnte face-smile ).

Das VB-Script fängt noch keine Fehler (wie zB "FileList.txt" existiert nicht oder Zieldateiname ist zu kurz) ab, sollte aber grundsätzlich den Teil 2 umsetzen.

HTH
bastla
InTreaTer
InTreaTer 16.09.2006 um 22:04:49 Uhr
Goto Top
Hallo bastla!

Die Idee des immer wieder suchens ist genial. Genau so werde ich das machen. Nur hast du mich missverstanden, was den Suchstring angeht. Die Dateien heissen immer gleich:
pd[Nr].txt, z.B. pd0000000354.txt oder pd0000001983.txt.
Nur der Suchstring variiert. Mal ist er ein Wort , mal 2 Worte und Mal ein ganzer String mit unbestimmtem Mittelteil: da käme dann sowas mit Platzhalter RM[....]1998.

Soweit aber erst mal ein DICKES dankeschön. Echt super, wie einem hier geholfen wird. Bin immer wieder begeistert über die Mentalität des Forums und der Leute!


Grüßle,

Markus.
InTreaTer
InTreaTer 16.09.2006 um 22:19:59 Uhr
Goto Top
zu schnell geschossen face-smile
habs grad selber mit den Platzhaltern hinbekommen.
Aktueller Stand also:

1. Suche: findstr /S /M JK....1998 *.txt >suche1.txt
2. Suche: findstr /M /F:suche1.txt zweitesSuchwort >suche2.txt
3. Suche: findstr /M /F:suche2.txt zweitesSuchwort >suche3.txt
usw.

Das passt schonmal perfekt!
Den zweiten Teil schaue ich mir dann morgen an. Jetzt ist erstmal Party angesagt face-wink)
Biber
Biber 20.09.2006 um 22:03:15 Uhr
Goto Top
Moin InTreaTerLe,
falls denn die Party wider Erwarten schon zu Ende gegangen sein sollte... face-wink

Kannst/willst du mit bastla's Snippet allein weiterlaufen?
Oder möchtest Du das selbe noch mal als native Batch?

Bitte nachhaken oder den Beitrag auf "Gelöst" setzen... so ist der Status unklar.

Danke und schönen (katerfreien) Abend

Biber
InTreaTer
InTreaTer 21.09.2006 um 16:58:28 Uhr
Goto Top
Guten Tach!

Party war ok face-smile

Ich habe mir am nächsten Tag auch Bastla´s 2. Teil angesehen - nur irgendwie recht schnell Kopfweh davon bekommen face-smile

Ehrlich gesagt steige ich noch nicht so ganz durch, was da genau passiert.
Geht das ganze mit nativem Batch auch Biber?


Grüßle,

Markus.
Biber
Biber 21.09.2006 um 19:19:14 Uhr
Goto Top
Alles außer Brotschneiden geht mit Batch, InTreaTerLe,

aber appetitlicher als bastla's Schnipsel sieht es auch nicht aus... eher im Gegenteil.
Liegt aber daran, dass im Batch die Substr()-Funktionen und auch die Variablennamen so aussehen als wäre jemand mit dem Kopf auf die Tastatur geschlagen.
Mein Schnipsel geht davon aus, dass in einer Datei "AllPds2Copy.lst" Deine "gefundenen" Dateien stehen.
Mimik bei mir wie bastla auch: Laufende Dateinummer bei mir ist fünfstellig (auf "pd000000" folgend).
Anzupassen ist von Dir die 2.Zeile mit den SET's. Und zum Scharfmachen das "@ECHO" rauszunehmen.

:: --------------snipp Move2FoundDir.bat
@echo off & setlocal enableDelayedExpansion
Set "TargetDir=f:\Found_StrXXX" && set "CopyList=AllPds2Copy" && Set "pdPrefix=pd000000"  
for /f %%i in ('dir /b /o %TargetDir%\%PdNewPrefix%*.txt') do set "Hi=%%~ni"   
Set /a "Hi=1%Hi:~-5%"  
for /f %%i in (%CopyList%) do set /a "Hi+=1" && @ECHO move %%i %TargetDir%\%pdPrefix%!Hi:~-5!.txt  
:: --------------snapp Move2FoundDir.bat

Ergebnis [im %TargetDir% ist die Datei mit der höchsten "Nummer" die pd00000000341.txt ]
>Move2FoundDir.bat
move \root\GruppeA\BenutzerA_1\pd50000000006.txt f:\Found_StrXXX\pd00000000342.txt
move \root\GruppeA\BenutzerA_1\pd50000000018.txt f:\Found_StrXXX\pd00000000343.txt
move \root\GruppeA\BenutzerA_1\pd50000000026.txt f:\Found_StrXXX\pd00000000344.txt
move \root\GruppeA\BenutzerA_2\pd50000000001.txt f:\Found_StrXXX\pd00000000345.txt
move \root\GruppeA\BenutzerA_2\pd50000000002.txt f:\Found_StrXXX\pd00000000346.txt
move \root\GruppeA\BenutzerA_2\pd50000000003.txt f:\Found_StrXXX\pd00000000347.txt

Gruß
Biber
P.S. Die Namenskonventionen für Deinen "gefunden"-Ordner hab ich nicht vollständig durchschaut.
Müsste analog zu bastla's Ansatz auch hier gemacht werden..
Set "TargetDir=F:\Found_Str%ErsterSuchbegriff%%ZweiterSuchbegriff%%LetzterSuchbegriff%"
P.P.S. Was treibst Du eigentlich da? Ist das so ein Brute-Force-Password-Durchnudel-Spiel?
InTreaTer
InTreaTer 21.09.2006 um 21:05:13 Uhr
Goto Top
Hi Biber!

Vom Chinesischen ins Japanische face-wink

Sobald ich am Wochenende ein bisschen Zeit finde werde ich mir das ganze dann anschauen und testen. Vielen Dank aber erstmal für eure Hilfe. Ich berichte auf jeden Fall, ob´s passt,...

Das Teil ist zur Auswertung einer Antispam-Appliance gedacht.
Also "für die gute Seite",...


Grüßle,

Markus.
InTreaTer
InTreaTer 07.10.2006 um 21:15:23 Uhr
Goto Top
Hallo zusammen!

Ich hoffe, daß ich mit meiner Frage nicht gegen die Forumsregeln verstosse.
Wäre einer der Herren biber oder bastla bereit, mir "erweiterten" Service per Fernwartung o.ä. zu leisten? Ich möchte das ganze batch-Zeug gerne möglichst rasch vom Tisch haben und brauche es aber recht schnell. Insofern würde ich denjenigen - natürlich gegen Bezahlung - auf unseren Server aufschalten, damit wir gemeinsam das ein oder andere Batchtool, das ich brauche zusammen erstellen.

Selbstverständlich kann das ganze hinterher hier wieder im Forum landen und der Thread geschlossen werden.

Ich komme nur leider die nächsten Wochen nicht zum experimentieren. Und ich glaube jeder Admin weiß, was mit solchen Vorhaben dann passiert, wenn sie mal 3-4 Wochen ruhen,....


Grüße,

Markus.
Biber
Biber 07.10.2006 um 21:50:30 Uhr
Goto Top
Moin, Intreater,

für bastla kann ich natürlich nicht sprechen, aber zumindest unterstellen..... ich denke, wir können Dich da schon unterstützen.

Ich schicke Dir mal per PN eine Mail-Addresse, dann schauen wir weiter.

Grüße
Biber
bastla
bastla 08.10.2006 um 11:13:11 Uhr
Goto Top
Hallo Markus!

Wenn Biber loslegt, bleibt für mich sicher kaum was zu tun ... face-smile

Für den Fall des Falles hast Du meine Adresse in Deiner Boardmail.

Grüße
bastla