rocky2k
Goto Top

Dateien suchen und Ordner verschieben

Moin,

ich möchte folgendes und ich hoffe ich bin nicht der 1000ste mit dieser Frage :D

Dateien anhand einer beliebigen Datei-Extension auf der lokalen Platte (z.B. Laufwerk D: ) suchen.
Dann den nur jeweils "letzten" Ordner in der Hierarchie an einen anderen (beliebigen) Ort (z.B. Laufwerk E: ) verschieben (natürlich inklusive aller Dateien innerhalb dieses Ordners).
Ich will natürlich nicht erst in die Ordnerstruktur hineinmüssen...es soll selbständig rekursiv die Platte durchforsten face-smile
Der automatisch erzeugte Zielordnername soll natürlich dem "letzten" Ordnernamen entsprechen...


Also z.B. "finde *.abc auf D:"

(gefunden) von hier
d:\ordner1\ordner2\ordner3\datei001.abc

(verschoben) nach hier
e:\ordner3\datei001.abc

Ich hoffe ich konnte es einigermaßen darstellen ;)

Gibt es dafür ein Tool? (ich konnte jedoch bislang kein geeignetes finden, alle Such-Move-Tools die ich bislang finden konnte, konnten das irgendwie nicht so...)


ciao andy

Content-ID: 188105

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

Ausgedruckt am: 26.11.2024 um 13:11 Uhr

bastla
bastla 16.07.2012 um 21:33:55 Uhr
Goto Top
Hallo rocky2k!

Kannst Du ausschließen, dass es etwa in "ordner1" oder "ordner2" auch Dateien vom Typ ".abc" gibt, bzw falls nicht, wie soll mit diesen Ordnern verfahren werden?

Außerdem: Kann etwa auch ein Ordner "D:\ordner4\ordner3" existieren, und wenn ja, sollen dann die Dateien in den vorher schon erstellten Ordner "e:\ordner3" verschoben werden, und wenn ja, kann es dort zu Kollisionen von gleichnamigen Dateien kommen?

Grüße
basla
rocky2k
rocky2k 16.07.2012 um 22:37:10 Uhr
Goto Top
Hallo basla,

nun vlt noch als Info:

die namen "ordner1" "ordner2" etc. sollten nur die verzeichnistiefe symbolisieren, also die namen sind grundsätzlich völlig beliebig. im allgemeinen sind die ordner über dem "letzten" auch leer.
evtl. kann durch rekursion immer der "letzte" ordner der die gesuchten dateien enthält als operationsziel herangezogen werden -> durch neuerliches aufrufen der operation könnte man auch dateien in den übergeordeten ordnern finden und diese ordner ebenso verschieben...

ciao andy
bastla
bastla 16.07.2012 aktualisiert um 23:08:15 Uhr
Goto Top
Hallo rocky2k!
die namen "ordner1" "ordner2" etc. sollten nur die verzeichnistiefe symbolisieren, also die namen sind grundsätzlich völlig beliebig.
Dass es sich dabei nur um Beispiele handelt, war mir schon klar - es bleibt aber trotzdem die Frage nach gleichnamigen Ordnern / Dateien in unterschiedlichen Pfaden offen ...

Grüße
bastla
bastla
bastla 16.07.2012 um 23:08:58 Uhr
Goto Top
... aber um zumindest einmal einen Überblick zu bekommen, könntest Du folgenden Batch testen:
@echo off & setlocal
set "Suche=D:\*.abc"  

set "Ordnerliste=%temp%\Ordner.txt"  
>"%Ordnerliste%" type nul  

for /f "delims=" %%i in ('dir /s/b/a-d "%Suche%"') do (  
    set "Ordner=%%~dpi"  
    setlocal enabledelayedexpansion
    findstr /ic:"!Ordner:\=\\!" "%Ordnerliste%">nul||>>"%Ordnerliste%" echo !Ordner!  
    endlocal
)
sort /r "%Ordnerliste%"  
pause
Die gefundenen Ordner könnten dann in dieser Reihenfolge (also jeweils vom Ende des Pfades her) verarbeitet werden ...

Grüße
bastla
rocky2k
rocky2k 16.07.2012 um 23:14:03 Uhr
Goto Top
Hallo bastla,

in der regel sind die zu suchenden dateien lediglich im letzten ordner der hierarchie. aber wie ich anmerkte könnte man die operation immer nur auf den "letzten" ordner anwenden. sollte sich beim ordnerverschieben zeigen dass es zwei ordner mit selben namen gibt, wäre eine frage nach dem motto "überschreiben, umbennen, abbrechen" denkbar (aber das wäre nur nice to have) eine meldung "schon vorhanden" oder so genügt fürs erste ;)

ciao andy
bastla
bastla 16.07.2012 aktualisiert um 23:48:41 Uhr
Goto Top
Hallo rocky2k!

Soferne der obige Ansatz vernünftige Ergebnisse liefert, könntest Du folgenden Batch testen:
@echo off & setlocal
set "Suche=D:\*.abc"  
:: Zielangabe immer mit abschließendem "\" schreiben! 
set "Ziel=E:\"  

set "Ordnerliste=%temp%\Ordner.txt"  
>"%Ordnerliste%" type nul  

for /f "delims=" %%i in ('dir /s/b/a-d "%Suche%" 2^>nul') do (  
    set "Ordner=%%~dpi"  
    setlocal enabledelayedexpansion
    findstr /ic:"!Ordner:\=\\!" "%Ordnerliste%">nul||>>"%Ordnerliste%" echo !Ordner!  
    endlocal
)
md "%Ziel%" 2>nul  
for /f "delims=" %%i in ('sort /r "%Ordnerliste%"') do for /f "delims=" %%o in ("%%i\dummy\..") do (  
    if not exist "%Ziel%%%~nxo" (  
        echo move "%%~dpi..\%%~nxo" "%Ziel%%%~nxo" >nul  
    ) else (
        echo "%Ziel%%%~nxo" bereits vorhanden!  
    )
)
pause
Die entscheidende Zeile 18 ist durch das "echo" noch "entschäft" - solange das dort steht, wird der Befehl zum Verschieben des jeweiligen Ordners nur angezeigt ...

Das etwas ungewöhnlich aussehende "%%~dpi..\%%~nxo" dient übrigens dazu, den "\" am Ende des jeweiligen Pfades aus der Ordnerliste zu eliminieren.

Grüße
bastla
rocky2k
rocky2k 17.07.2012 um 01:15:36 Uhr
Goto Top
Hallo bastla,

many thx schonmal für das batchlisting !

werde ich mir sodann mal näher anschauen...

ciao andy
TsukiSan
TsukiSan 17.07.2012 um 16:10:10 Uhr
Goto Top
@bastla,

mal nur so eine Frage am Rande:
Inwieweit kann man sicherstellen, dass immer der letzte Ordner in richtiger Reihenfolge angegeben wird? Oder anders-her-rum: Durchstöbert ein CMD wirklich von "oben" nach "unten"?
Man sieht sehr oft, dass bei der Windows-Suchfunktion die Reihenfolge der Ordner nicht unbedingt dem entspricht, wie man selber meint, dass es die "richtige" Reihenfolge ist.

Als Beispiel:
Ich habe einen kleinen Audioplayer, mit dem ich eine ganze Partition/ganze Partitionen nach Audio-Dateien durchsuchen kann und alle gefundenen Dateien mir in meine Playlist einträgt. Das entspricht nicht immer der Reihenfolge (auch bei den Ordnern), wie ich es erwartet hätte.
(da sind allerdings VB6 und VBS im Spiel)

Gruss
Tsuki
rocky2k
rocky2k 17.07.2012 um 16:32:16 Uhr
Goto Top
Hallo bastla,

nun mal zum Test. Hab folgenden Test-Pfad + Dateien:

D:\_test_\o1\o2\file1.abc
D:\_test_\o1\o2\file2.abc

Dein 1. batch liefert mir am Ende (und so stehts auch in der ...Ordner.txt) den Pfad D:\_test_\o1\o2\ soweit so gut
Dein 2. batch zeigt überhaupt nichts außer "Drücken Sie eine beliebige Taste..." hm?

die echos kommen irgendwie nicht raus -> im 1. batch vermutlich nur deshalb schon, weil noch ein "sort" steht, weil ohne die sort Zeile kommt nix...(?)

Ist Zeile 15 so korrekt? -> ich musste zum testen nämlich in Zeile 4 den Zielordner manuell auf "d:\o2\" setzen...
Auch ein entfernen des echo in Zeile 18 brachte im Ablauf dann ein "Zugriff verweigert"

ach ja:
führe die cmd-shell als admin aus


ciao andy
bastla
bastla 17.07.2012, aktualisiert am 18.07.2012 um 00:38:33 Uhr
Goto Top
Hallo Tsuki!
Inwieweit kann man sicherstellen, dass immer der letzte Ordner in richtiger Reihenfolge angegeben wird?
Dazu dient die am Ende durchgeführte Sortierung - da absteigend sortiert wird, wird immer der jeweils längste Pfad (= der am weitesten "unten" liegende Ordner) zuerst verarbeitet ...

Das lässt sich natürlich auch nach VB/VBS übertragen, indem zuerst alle relevanten Pfade ermittelt und dann entsprechend sortiert werden ...

Grüße
bastla
bastla
bastla 17.07.2012 aktualisiert um 17:18:26 Uhr
Goto Top
Hallo rocky2k!

Hinsichtlich der fehlenden Ausgabe bei Batch 2: Ich hatte vorweg schon das Verschieben getestet und die jeweilige Meldung
        1 Datei(en) verschoben.
per ">nul" unterdrückt - was natürlich bei einem "echo" davor dann eher kontraproduktiv ist face-wink - daher einfach am Ende der Zeile 18 ">nul" wieder entfernen, um die Ausgabe zu sehen ...
Ist Zeile 15 so korrekt?
Weshalb nicht? Es wird der Zielordner (in den dann alle Unterordner sollen) erstellt, oder, wenn schon vorhanden, die resultierende Fehlermeldung
Ein Unterverzeichnis oder eine Datei mit dem Namen "D:\o2" existiert bereits.
mit "2>nul" unterdrückt.
ich musste zum testen nämlich in Zeile 4 den Zielordner manuell auf "D:\o2\" setzen...
Natürlich musst Du angeben, wohin die Ordner sollen (wobei es vermutlich keine gute Idee ist, wenn der Zielordner im "Quellbereich" (es wird ja ab D:\ gesucht) liegt ...
Zum "Zugriff verweigert" kann ich nicht viel sagen - bei meinem Test funktioniert der gepostete Batch (mit nicht überschneidenden Quell-/Zielpfaden) ...

Grüße
bastla
TsukiSan
TsukiSan 17.07.2012 um 17:25:37 Uhr
Goto Top
Hallo bastla,

naja, bei meinem kleinen Audioplayer ist es relativ Wurscht, wie er die Dinger abspielt, weil er sie eh per Zufall abspielen soll.

Unser rocky2K darf sich dann am besten noch eine Sortierroutine einbauen. Wir wissen ja nicht, um wieviele Ordner sich es rekursiv handeln wird face-wink
Bubble-Sort ist dein Freund face-wink

Nochmals Danke und viele Grüsse

Tsuki
bastla
bastla 17.07.2012 um 19:23:42 Uhr
Goto Top
Hallo Tsuki!
Unser rocky2K darf sich dann am besten noch eine Sortierroutine einbauen.
Zeile 16?

Grüße
bastla
TsukiSan
TsukiSan 18.07.2012 um 00:35:23 Uhr
Goto Top
Hallo bastla,

Zeile 16?

hatte ich übersehen. Sorry! ist wohl schon ein bisschen spät face-wink

Viele Grüße

Tsuki
bastla
bastla 18.07.2012 um 00:37:16 Uhr
Goto Top
Hallo Tsuki!
ist wohl schon ein bisschen spät face-wink
In welcher Zeitzone bist Du denn derzeit?

Grüße
bastla
TsukiSan
TsukiSan 18.07.2012 um 03:51:40 Uhr
Goto Top
Hallo bastla,

In welcher Zeitzone bist Du denn derzeit?

Sternzeit 42679,5 face-wink

Viele Grüsse

Tsuki
bastla
bastla 18.07.2012 um 09:50:53 Uhr
Goto Top
[OT] Hallo Tsuki!

Obwohl meine Frage ausnahmsweise einmal ernst gemeint war, wären 6 Stunden Zeitverschiebung durchaus dazu angetan, die Konzentration etwas zu beeinträchtigen ... face-wink

Grüße
bastla
[/OT]
TsukiSan
TsukiSan 18.07.2012 um 10:08:23 Uhr
Goto Top
[OT]Hallo bastla,

hast du ja schnell rausbekommen, was ich meinte face-smile

Heute bin ich wieder etwas "wacher". Mal sehen, wie lange face-wink

Viele Grüße

Tsuki
[/OT]
rocky2k
rocky2k 20.07.2012 um 15:16:10 Uhr
Goto Top
Hallo Bastla,

also irgendwie steh ich jetzt aufm Schlauch.

Bei einem neuen Test unter WinXP wird die Ordner.txt zwar angelegt, diese bleibt aber völlig leer...

Ich habe als Test auf
D: die Ordnerstruktur D:\o1\o2\o3\o4
und in o4 die 3 Files f1.abc, f2.abc, f3.abc

set im batch:
set "Suche=D:\*.abc"
set "Ziel=C:\"


Auf C: (als Test) soll ja wie gesagt der Ordner o4 mit seinem Inhalt hinverschoben werden (also Ergebnins soll sein C:\o4\*.abc)


Muss ich noch was wissen welche Systemvoraussetzungen ich für Deinen obigen batch brauche ?


ciao andy
bastla
bastla 20.07.2012 um 16:16:39 Uhr
Goto Top
Hallo rocky2k!

Inzwischen habe ich das auch unter XP mit 2 verschiedenen Laufwerken getestet (vorher hatte ich nur von "D:\Quelle\*.abc" nach "D:\Ziel\" verschieben lassen) und kann die Meldung
Zugriff verweigert
bestätigen - ein Verschieben auf ein anderes Laufwerk ist mit "move" (auch mit Admin-Rechten) nicht möglich (hatte ich auch schon mal unter VBS festgestellt).

Als Workaround würde sich daher kopieren und löschen anbieten:
@echo off & setlocal
set "Suche=D:\*.abc"  
:: Zielangabe immer mit abschließendem "\" schreiben! 
set "Ziel=C:\"  

set "Ordnerliste=%temp%\Ordner.txt"  
>"%Ordnerliste%" type nul  

for /f "delims=" %%i in ('dir /s/b/a-d "%Suche%" 2^>nul') do (  
    set "Ordner=%%~dpi"  
    setlocal enabledelayedexpansion
    findstr /ic:"!Ordner:\=\\!" "%Ordnerliste%">nul||>>"%Ordnerliste%" echo !Ordner!  
    endlocal
)
md "%Ziel%" 2>nul  
for /f "delims=" %%i in ('sort /r "%Ordnerliste%"') do for /f "delims=" %%o in ("%%i\dummy\..") do (  
    echo Verarbeite "%%i"  
    if not exist "%Ziel%%%~nxo" (  
        xcopy /ehk "%%i*" "%Ziel%%%~nxo\">nul && rd /s /q "%%i"  
    ) else (
        echo "%Ziel%%%~nxo" bereits vorhanden!  
    )
)
pause
Grüße
bastla
rocky2k
rocky2k 20.07.2012 um 17:21:00 Uhr
Goto Top
Hallo Bastla,

ja nun wird gemoved wie gewünscht... face-smile ABER:
Auf meinem aktuellen XP System will sich die Ordner.txt nicht füllen...ich hatte zum testen der batch den Such-Pfad manuell in die Ordner.txt eintragen müssen...seltsam...
Das Zielsystem unter Win7 - dort füllte sich die Ordner.txt ja wie gewünscht - kann ich erst in den nächsten Tagen testen...

ciao andy
bastla
bastla 20.07.2012 um 17:44:02 Uhr
Goto Top
Hallo rocky2k!

Sollte nicht am XP liegen, da ich damit getestet habe ...

Wenn Du dem Batch "über die Schulter schauen" möchtest, einfach aus "echo off" ein "echo on" machen und direkt aus der CMD-Shell starten - auf Wunsch auch mit einer Umleitung der Ausgabe in eine Textdatei, damit Du Dir das dann in Ruhe ansehen kannst - etwa durch Eingabe von:
D:\Ordnerverschieben.cmd>D:\Logdatei.txt
Grüße
bastla