Batch Windows-Dateiensuche möglich?

Der Backup-Ordner, der durchsucht wird, ist schon groß. Da sind sämtliche Handy-Backups aus über 10 Jahren drin. Das sind bestimmt knapp 50 GB an allerlei Dateien.

Jetzt läuft die Suche schon 10 Minuten, aber der gefunden-Ordner ist immer noch leer. Vermutlich gibt es die ganzen, gewünschten Dateien nicht...
 
Kannst ja wenn er fertig ist, mal die Windows-Suche stichprobenartig als Gegenprobe nehmen. Unterbrechen sollte mit STRG+C gehen ;).

Momentan nimmt er einen Namen von der Liste und durchsucht den Ordner - jedes Mal :) Brute Force, das dauert in deinem Fall.

Nicht umsonst arbeiten Such-Tools mit Indizes, die immer bei Leerlauf im Hintergrund aktualisiert werden.
 
mae1cum77 schrieb:
Kannst ja wenn er fertig ist, mal die Windows-Suche stichprobenartig als Gegenprobe nehmen. Unterbrechen sollte mit STRG+C gehen ;).

Das habe ich versucht, aber irgendwie krieg ich das nicht pausiert. Neuen Befehl schreiben geht auch nicht - ich kann höchstens den Cursor an eine x-beliebige Stelle setzen, die dann bis zur letzten Befehlszeile alles mit Leerzeichen auszufüllen scheint.

Bei STRG C passiert auch nichts.
 
Beende den CMD mal mit dem 'X', ist die Frage, wie das Netzlaufwerk hier reagiert.
 
Ich habe das Script nun direkt auf dem Netzwerkcomputer ausgeführt. Aber auch da reagiert CMD nicht auf STRG C und auf sonstige weitere Befehleingabe, sobald mal Suche.bat gestartet wurde.
 
Sollte sich im Taskmanager beenden lassen.

Ansonsten könnte man noch testen, einen 'Index' zu erstellen (also alle Pfade des Suchordners in eine TXT) und dann die TXT durchsuchen und dann gefundene Dateien kopieren. Das erspart das ständige gerödel bei der suche und findet dann in der TXT statt.

Code:
@echo off
setlocal EnableExtensions
setlocal EnableDelayedExpansion
pushd "%~dp0"
cd "%~dp0"
if exist "search.txt" del /s /q "search.txt" >nul
for /r "w:\backup" %%A in (*.*) do echo %%A>>search.txt
for /f "delims=" %%i in (output.txt) do (
    for /f "delims=" %%A in (search.txt) do (
        if "%%~nxA"=="%%~nxi" xcopy "%%A" /cherky "C:\Users\name\Desktop\gefunden"
))
pause

EDIT: Habe den Copy-Befehl mal auf XCOPY mit allen Rechten umgestellt, sollte ohne Fragen zu stellen Kopieren.
 
Danke dir.

Kannst du dieses Index-Script nun auch noch so einstellen, dass die Leerzeichen in der Output.txt Datei keine Probleme mehr bereiten?

Ich habe gerade von meinem anderen WA-Account eine neue output.txt per Script generiert und möchte mal schauen, ob er wenigstens dort die Dateien findet, die im WA-Medienordner zu fehlen scheinen...

Hintergrund:
die Output-txt ist das Script-Ergebnis eines Vergleichs der im WA-Medienordner tatsächlich vorhandenen Dateien und jenen, die WhatsApp noch "vermisst" aufgrund seiner angelegten Datenbank. Die Output.txt Datei listet dabei nur die jeweils noch fehlenden Dateien auf. Diese sollen nun via Suche im Backup-Ordner auf dem Computer gefunden und kopiert werden


Bash:
dir="/sdcard/msgstore.db"
mediadir="/sdcard/WhatsApp"

results=$(sqlite3 "$dir" "select message_row_id, file_path from message_media where file_path is not null;")

while IFS='|' read -r id file_path; do

  if [[ ! -f "$mediadir/$file_path" ]]; then
    echo "$mediadir/$file_path"
  fi
done <<< "$results"

Jetzt will ich aber nicht nochmal alle Leerzeichen entfernen, deswegen wäre es gut, wenn das Script diese direkt berücksichtigt.
 
  • Gefällt mir
Reaktionen: s1ave77
Marvolo schrieb:
Kannst du dieses Index-Script nun auch noch so einstellen, dass die Leerzeichen in der Output.txt Datei keine Probleme mehr bereiten?
Die Leerzeichen werden durch das "delims=" unterdrückt, hab ich getestet, sowohl in output.txt als auch in search.txt. Das sollte kein Problem sein. Referenz mein letzter Post.

Achte auf die Änderung zu XCOPY als edit in meinem letzten Post, das ist besser und behandelt alle Fälle von Problemen beim Kopieren (Rechte und co.).

Meine test output.txt:
Code:
e:/te st/picture.001.jpg
e:/te st/picture.002.jpg
e:/te st/picture.003.jpg
e:/te st/picture.004.jpg
e:/te st/picture.005.jpg
e:/te st/picture.006.jpg

Der Testordner zum Durchsuchen hatte auch Leerzeichen im Pfad.
 
  • Gefällt mir
Reaktionen: Marvolo
Die search.txt Index-Datei hat er nun erstellt. Den "gefunden" Ordner allerdings noch nicht. Hätte ich den manuell erstellen müssen, oder erstellt er das Verzeichnis automatisch, sobald er kopiert? (Ist jetzt nicht mehr Desktop, sondern E:\gefunden - Aber nur im Script, physikalisch erstellt auf dem Laufwerk habe ich ihn nicht).

PS: Und jetzt klappt das auch mit dem Pausieren. Bei STRG C kommt dann "Batchvorgang abbrechen? (J/N)"
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: s1ave77
Marvolo schrieb:
oder erstellt er das Verzeichnis automatisch, sobald er kopiert?
Wenn der Pfad mit einem \ endet, wird der Ordner automatisch erstellt. Wenn nicht fragt er, ob Datei oder Verzeichnis.
 
Endet so:

Code:
@echo off
setlocal EnableExtensions
setlocal EnableDelayedExpansion
pushd "%~dp0"
cd "%~dp0"
if exist "search.txt" del /s /q "search.txt" >nul
for /r "e:\backup" %%A in (*.*) do echo %%A>>search.txt
for /f "delims=" %%i in (output.txt) do (
    for /f "delims=" %%A in (search.txt) do (
        if "%%~nxA"=="%%~nxi" xcopy "%%A" /cherky "E:\gefunden"
))
pause
 
@Marvolo wie gesagt, entweder "E:\gefunden\" oder Ordner erstellen, sonst fragt er beim ersten Kopiervorgang, was es denn sein soll :).
 
  • Gefällt mir
Reaktionen: Marvolo
Die Frage wäre noch:

was macht das Script, wenn es mehrere Dateien im Zielverzeichnis findet, die alle denselben Dateinamen haben? Im Backup-Ordner sind nämlich teilweise doppelte oder dreifache Kopien von manchen Dateien, die das Script suchen soll.

Kopiert es dann jeweils nur eine Instanz der Datei, oder alle 3/4/5 mit jeweils abweichendem Dateinamen (1), (2), (3), etc.?
 
Marvolo schrieb:
Kopiert es dann jeweils nur eine Instanz der Datei, oder alle 3/4/5 mit jeweils abweichendem Dateinamen (1), (2), (3), etc.?
Gerade nur die letzte. Da noch Hash-Checks oder ähnliches einzubauen, würde das verkomplizieren.

Du könntest mit if "%%~nxA"=="%%~nxi" echo %%A>>result.txt statt des Copy auch vorher schauen, was zu erwarten ist. Da wird alles geloggt.
 
Es würde reichen, wenn es nur EINE der Kopien kopiert. Mich wundert es nur, dass es immer noch keine Dateien kopiert hat. Also entweder, die Dateien gibt es nicht, oder es findet die Dateien nicht.

Habe jetzt mal den Zielordner noch viel genauer eingegrenzt und quasi direkt auf den Ordner verwiesen, von dem ich weiß, dass da definitiv einige der gewünschten Dateien drin sind. Mal sehen, ob er sie nun endlich findet.
 
Frage ist, ob das Finden oder das Kopieren 'hakt'. Daher als Test mal alle Pfade in eine Datei schreiben lassen oder als Output anzeigen lassen. Dann weiß man mehr :).
Ergänzung ()

Hier eine Variante, die bei mehrfachen Dateien, den ersten Namen beläßt und die anderen numeriert:
Code:
@echo off
setlocal EnableExtensions
setlocal EnableDelayedExpansion
pushd "%~dp0"
cd "%~dp0"
if exist "search.txt" del /s /q "search.txt" >nul
for /r "e:\backup" %%A in (*.*) do echo %%A>>search.txt
for /f "delims=" %%i in (output.txt) do (
    set "count="
    for /f "delims=" %%A in (search.txt) do (
        if "%%~nxA"=="%%~nxi" (
            set /a count+=1
            if "!count!"=="1" (
                xcopy "%%A" /cherky "E:\gefunden\"
                rem echo %%~nxA
            ) else (
                xcopy "%%A" /cherky "E:\gefunden\%%~nA_!count!%%~xA"
                rem echo %%~nA_!count!%%~xA
))))
pause
Ergänzung ()

Noch ein Edit: Das Ganze klappt gerade nur, wenn Dateiname und Erweiterung identisch sind. Wird statt .jpg etwa .JPG im Suchordner gefunden, ist es trotz Namesgleichheit kein Match.

Um das zu umgehen den Vergleich auf den Namen beschränken:
Code:
if "%%~nA"=="%%~ni" (
 
Zuletzt bearbeitet von einem Moderator:
  • Gefällt mir
Reaktionen: Marvolo
Das Ganze sieht also nun so aus (auf Dateiname beschränkt und nicht auf Endung)?

Code:
@echo off
setlocal EnableExtensions
setlocal EnableDelayedExpansion
pushd "%~dp0"
cd "%~dp0"
if exist "search.txt" del /s /q "search.txt" >nul
for /r "e:\backup" %%A in (*.*) do echo %%A>>search.txt
for /f "delims=" %%i in (output.txt) do (
    set "count="
    for /f "delims=" %%A in (search.txt) do (
        if "%%~nA"=="%%~ni" (
            set /a count+=1
            if "!count!"=="1" (
                xcopy "%%A" /cherky "E:\gefunden\"
                rem echo %%~nxA
            ) else (
                xcopy "%%A" /cherky "E:\gefunden\%%~nA_!count!%%~xA"
                rem echo %%~nA_!count!%%~xA
))))
pause

Dann lass ich das jetzt so nochmal durchlaufen...
 
  • Gefällt mir
Reaktionen: s1ave77
Update:

nach langem Warten (das Erstellen der Index-Suchdatei hat sehr lange gedauert, die war am Ende knapp 25 MB groß) hat es dann endlich angefangen zu kopieren. Allerdings war auch das alles sehr langsam und es hat mich bevor jeder kopierten Datei gefragt, ob die nun ein Verzeichnis ist oder eine Datei:

cmd.jpg


Wenn ich das in der Geschwindigkeit so durchlaufen hätte lassen, hätte das bei der Größe der gesuchten Dateien sicherlich nen halben oder ganzen Tag gesucht und kopiert.

Ich denke, es wäre daher sinnvoller, den Suchalgorithmus noch etwas zu präszisieren bzw große Teile der Dateien im Suchordner auszuschließen.

Zum einen sollen im Suchordner lediglich WhatsApp-relevante Dateien gefunden werden. Da sich im Suchordner aber auch Dateien befinden, auf die das nicht zutrifft, müssten sie vorher ausgeschlossen werden.
WhatsApp-Dateien haben einen sehr fest definierten Dateinamen und beinhalten fast immer ein "WA00..." im Dateinamen.

Vielleicht kann die Suche darauf präzisiert werden, dass es im Index-Text-Script nur Dateinamen listet, die im Namen den Bestandteil "WA00" haben bzw. die identisch sind zum Dateinamen in der output.txt-Datei und alles andere, was sich sonst noch im Backup-Ordner befindet, außer Acht lässt?

Zweitens: ein Problem, das ich nicht auf dem Schirm hatte: zwar findet das Script dann alle relevanten Dateien - aber es kopiert sie, wie ja gewünscht, alle zusammen in den "gefunden"-Ordner.

Nun ist der Aufbau des WA-Mediaordners aber etwas besonders, denn es wird dort speicherortmäßig unterschieden zwischen empfangenen und gesendeten Dateien. So landen empfangene Bilder/Videos im jeweiligen dafür vorgesehenen Ordner (WhatsApp Images / WhatsApp Video), GESENDETE Bilder oder Videos allerdings landen in einem dort namens "sent" erstellten Unterordner in WhatsApp Images/sent bzw. WhatsApp Videos/sent).

Das Script müsste optimalerweise erkennen, aus welcher Ordnerstruktur es im Suchordner die Dateien kopiert hat und im "gefunden"-Ordner diese Ordnerstruktur nachbauen: sprich: auch dort Bilder zu "Images", gesendete Bilder zu "images/sent", etc.

Sonst endet nachher alles vermischt im "gefunden"-Ordner und ich muss das dann alles händisch wieder sortieren, womit ich am Ende genauso schnell wäre, wie wenn ich alles händisch suchen und kopieren würde.

Allerdings weiß ich nicht, wie komplex und umfangreich solche Änderungen am Script wären und ob man das Script überhaupt in beachtlicher Weise "beschleunigen" kann - weil gestern Abend hat alles wirklich ewig gedauert, angefangen von der Erstellung der Index-Datei und dann das eigentliche Kopieren, wo auch jedes Mal erst wieder eine Abfrage kam.

Vermutlich liegt es an der Brute-Force Methode, dass alles so ewig braucht. Eventuell kann man es dann auch nicht wirklich beschleunigen und ich muss wohl doch alles händisch/manuell suchen und kopieren?

Vielen Dank
 
  • Gefällt mir
Reaktionen: s1ave77
Soll das Ganze denn mehrfach ausgeführt werden oder nur einmal?
Grob gesagt: Stört es, wenn der Rechner ohne Nutzerinteraktion eine Nacht über kopiert? Denn wenn nicht, dann muss man es ja auch nicht beschleunigen.
Und hast du zufälligerweise Python installiert? Mit os.path bspw. hat man schnell die Pfadmanipulationen.

Wie immer der Hinweis: Batch ist halt nur Stapelverarbeitung, keine "ausgewachsene Skriptsprache" und macht vieles umständlicher als andere Sprachen. Geht aber (bestimmt) auch damit.
 
  • Gefällt mir
Reaktionen: Marvolo

Ähnliche Themen

Zurück
Oben