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.
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.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 40266
Url: https://administrator.de/contentid/40266
Ausgedruckt am: 27.11.2024 um 01:11 Uhr
11 Kommentare
Neuester Kommentar
Hallo Markus!
Ein erster (schematischer) Ansatz für Teil 1 zur Erzeugung einer Liste aller passenden Dateien:
"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
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
Mögliche Fortsetzung:
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 ).
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
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 ).
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
Moin InTreaTerLe,
falls denn die Party wider Erwarten schon zu Ende gegangen sein sollte...
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
falls denn die Party wider Erwarten schon zu Ende gegangen sein sollte...
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
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.
Ergebnis [im %TargetDir% ist die Datei mit der höchsten "Nummer" die pd00000000341.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?
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?