Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

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

Frage Entwicklung Batch & Shell

Mitglied: InTreaTer

InTreaTer (Level 1) - Jetzt verbinden

16.09.2006, aktualisiert 08.10.2006, 8033 Aufrufe, 11 Kommentare

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.
Mitglied: bastla
16.09.2006 um 19:26 Uhr
Hallo Markus!

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

01.
cd /d LW:\root 
02.
REM Nur dem Dateinamensschema entsprechende Dateien mit enthaltenem "ErsterSuchstring" 
03.
REM suchen und in einer Temporärdatei zwischenspeichern 
04.
findstr /S /M "ErsterSuchstring" ABC????19098.txt > Temp1.txt 
05.
REM Nur die in der Temporärdatei angeführten Dateien nach "ZweiterSuchstring" durchsuchen 
06.
REM und die gefundenen Dateien wieder in eine Temporärdatei schreiben usf. 
07.
findstr /M /F:Temp1.txt "ZweiterSuchstring" > Temp2.txt 
08.
09.
10.
11.
REM Entsprechend dem letzten Suchstring die endgültige Dateiliste erzeugen 
12.
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
Bitte warten ..
Mitglied: bastla
16.09.2006 um 21:22 Uhr
Mögliche Fortsetzung:

01.
FileListPath = "Z:\root\FileList.txt" 
02.
 
03.
TargetPath = "Z:\root2\Found" & _ 
04.
	"_" & "ErsterSuchbegriff" & _ 
05.
	"_" & "ZweiterSuchbegriff" & _ 
06.
	"_" & "LetzterSuchbegriff\" 
07.
 
08.
Set fso = Wscript.CreateObject("Scripting.FileSystemObject") 
09.
 
10.
'Gegebenen Falls Zielpfad erstellen 
11.
If Not fso.FolderExists(TargetPath) Then fso.CreateFolder(TargetPath) 
12.
Set CurrentFolder = fso.GetFolder(TargetPath) 
13.
 
14.
MaxNum = 0 
15.
 
16.
For Each Datei In CurrentFolder.Files 
17.
	'Laufende Dateinummer fünfstellig (auf "pd500000" folgend) 
18.
	Num = CInt(Mid(Datei.Name,9,5)) 
19.
	If Num > MaxNum Then MaxNum = Num 
20.
Next 
21.
 
22.
FileNum = MaxNum + 1 
23.
 
24.
Set FileList = fso.OpenTextFile(FileListPath, 1) 
25.
 
26.
Do While Not FileList.AtEndOfStream 
27.
	OldFile = FileList.ReadLine 
28.
	NewFile = TargetPath & "pd500000" & Right("00000" & CStr(FileNum), 5) & ".txt" 
29.
	fso.MoveFile OldFile, NewFile 
30.
	FileNum = FileNum + 1 
31.
Loop 
32.
 
33.
FileList.Close 
34.
Set FileList = Nothing 
35.
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
Bitte warten ..
Mitglied: InTreaTer
16.09.2006 um 22:04 Uhr
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.
Bitte warten ..
Mitglied: InTreaTer
16.09.2006 um 22:19 Uhr
zu schnell geschossen
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 )
Bitte warten ..
Mitglied: Biber
20.09.2006 um 22:03 Uhr
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
Bitte warten ..
Mitglied: InTreaTer
21.09.2006 um 16:58 Uhr
Guten Tach!

Party war ok

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

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


Grüßle,

Markus.
Bitte warten ..
Mitglied: Biber
21.09.2006 um 19:19 Uhr
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.

01.
:: --------------snipp Move2FoundDir.bat 
02.
@echo off & setlocal enableDelayedExpansion 
03.
Set "TargetDir=f:\Found_StrXXX" && set "CopyList=AllPds2Copy" && Set "pdPrefix=pd000000" 
04.
for /f %%i in ('dir /b /o %TargetDir%\%PdNewPrefix%*.txt') do set "Hi=%%~ni"  
05.
Set /a "Hi=1%Hi:~-5%" 
06.
for /f %%i in (%CopyList%) do set /a "Hi+=1" && @ECHO move %%i %TargetDir%\%pdPrefix%!Hi:~-5!.txt 
07.
:: --------------snapp Move2FoundDir.bat
Ergebnis [im %TargetDir% ist die Datei mit der höchsten "Nummer" die pd00000000341.txt ]
01.
>Move2FoundDir.bat 
02.
move \root\GruppeA\BenutzerA_1\pd50000000006.txt f:\Found_StrXXX\pd00000000342.txt 
03.
move \root\GruppeA\BenutzerA_1\pd50000000018.txt f:\Found_StrXXX\pd00000000343.txt 
04.
move \root\GruppeA\BenutzerA_1\pd50000000026.txt f:\Found_StrXXX\pd00000000344.txt 
05.
move \root\GruppeA\BenutzerA_2\pd50000000001.txt f:\Found_StrXXX\pd00000000345.txt 
06.
move \root\GruppeA\BenutzerA_2\pd50000000002.txt f:\Found_StrXXX\pd00000000346.txt 
07.
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?
Bitte warten ..
Mitglied: InTreaTer
21.09.2006 um 21:05 Uhr
Hi Biber!

Vom Chinesischen ins Japanische

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.
Bitte warten ..
Mitglied: InTreaTer
07.10.2006 um 21:15 Uhr
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.
Bitte warten ..
Mitglied: Biber
07.10.2006 um 21:50 Uhr
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
Bitte warten ..
Mitglied: bastla
08.10.2006 um 11:13 Uhr
Hallo Markus!

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

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

Grüße
bastla
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Batch & Shell
gelöst EDI Dateien auf Inhalt prüfen und verschieben (6)

Frage von ThomasKern zum Thema Batch & Shell ...

Batch & Shell
gelöst Verschieben und Umbenennen von Video-Dateien anhand der Nummer im Namen (3)

Frage von Foja.Filmer zum Thema Batch & Shell ...

Entwicklung
gelöst Anhand einer Excelliste nach Dateien auf Server suchen und verschieben (11)

Frage von xsto123 zum Thema Entwicklung ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Windows 7
Verteillösung für IT-Raum benötigt (12)

Frage von TheM-Man zum Thema Windows 7 ...