schikopix
Goto Top

Dateien aus einer Liste (txt) finden und kopieren

Dateien (Bilder) deren Dateinamen in einer Liste vorliegen die aber in verschiedenen Untordnern liegen finden und in einen Ordner kopieren

Ich muss regelmässig Bilddateien aus einer Ortdnerstruktur finden und in bearbeiten.

Ich suche ein Tool / Batchdatei / Script das:

die Liste sieht ewa so aus:


5689
8977
45887


(Die Dateinamen sind da also ohne Erweiterung , aber das könnte ich ggf ja einfach ändern...)


Die dateien liegen in Unterverzeichnissen eines Ordners und sollen gefunden und in einen gemeinsamen Zielordner kopiert werden.

Leider bin ich nirgendwo fündig geworden und ich kann sowas nicht...?


Dürfte doch eigentlich gar nicht soo kompliziert sein, oder??

Content-Key: 106321

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

Printed on: April 23, 2024 at 20:04 o'clock

Mitglied: 60730
60730 Jan 17, 2009, updated at Oct 18, 2012 at 16:37:37 (UTC)
Goto Top
Serus und willkommen,

auch wenn es nicht die netteste Begrüßung ist - Bastla muß sowas dauernd schreiben, das hätte dir auch vor dem Posten deines Beitrages auffallen können - das dein Wunsch Hier (fast täglich immer leicht anders formuliert) gestellt wird.

Gruß
Member: Biber
Biber Jan 17, 2009 at 13:51:20 (UTC)
Goto Top
Moin schikopix,

willkommen im Forum.
Und da kannst Du noch froh sein, dass T-Mo diesen Beitrag vor mir gefunden hat.

Nur ganz kurz:
  • Wir begrüßen uns hier nicht mit "Dateien (Bilder) deren Dateinamen in einer Liste vorliegen die aber in"
  • und die hier übliche Abschiedsfloskel ist nicht "Dürfte doch eigentlich gar nicht soo kompliziert sein, oder??"

Grüße
Biber
Member: schikopix
schikopix Jan 17, 2009 at 15:20:18 (UTC)
Goto Top
Hallo Timo,

habe mir wirklich Mühe gegeben einen entsprechenden Post zu finden, aber auch der Post von Bastla den Du mir verlinkt hast löst mein Problem nicht wirklich. -Vielleicht bin ich auch zu doof, das entsprechend zu übersetzen-
wenn ich die Dateien nicht verschieben will, muss ich wohl 'move' durch 'copy' ersetzen ?

Außerdem sind bei mir die files in unterordnern,,liegt es daran das es nicht geht?

ich hatte das so angepasst:#
G:\Sabrina_06_2009\RAW
in diesem Ordner bzw in mehrer Unterordnern unterhalb diieses Ordner liegen die zu findenden Dateien (da sind natürlich auch noch viele andere Dateien drin)

G:\ziel
(in diesen Ordner soll kopiert werden, dieser existiert und ist leer)

G:\text.txt
ist die Datei mit den Dateinamen, ohne ,,Pfad und ohne Erweiterung

wenn ich das script so anpasse:

@echo off & setlocal
set "Source=G:\Sabrina_06_2009\RAW"
set "Archiv=G:\ziel"
set "List=G:\text.txt"

for /f "usebackq delims=" %%i in ("%List%") do call :ProcessFile "%%i"
goto :eof

:ProcessFile
set "S=%Source%\%~1"
if %S:~-1%==\ goto :eof
set "T=%Archiv%\%~p1"
if not exist "%T%" md "%T%"
move "%S%" "%T%"


, erhalte ich folgende 'Ausgabe'

@echo off & setlocal
set "Source=G:\Sabrina_06_2009\RAW"
set "Archiv=G:\ziel"
set "List=G:\text.txt"

for /f "usebackq delims=" %%i in ("%List%") do call :ProcessFile "%%i"
goto :eof

:ProcessFile
set "S=%Source%\%~1"
if %S:~-1%==\ goto :eof
set "T=%Archiv%\%~p1"
if not exist "%T%" md "%T%"
move "%S%" "%T%"


kann mir da bitte jemand weiterhelfen?
Member: schikopix
schikopix Jan 17, 2009 at 15:22:18 (UTC)
Goto Top
Hallo Biber,

danke fürs Kopfwaschen :-]

bemühe mich um Besserung!

Gruß

schikopix
Member: bastla
bastla Jan 17, 2009 at 16:05:14 (UTC)
Goto Top
Hallo schikopix und auch von mir ein Willkommen!

Unter der Annahme, dass es innerhalb der Quelldatenstruktur die entsprechende Datei nur einmal gibt, sollte das etwa so gehen:
@echo off & setlocal
set "Source=G:\Sabrina_06_2009\RAW"  
set "Archiv=G:\ziel"  
set "List=G:\text.txt"  

for /f "usebackq delims=" %%i in ("%List%") do call :ProcessFile "%%i"  
goto :eof

:ProcessFile
for /f "delims=" %%a in ('dir /s /b "%Source%\%~1"') do set "S=%%a"  

set /a Nr=1000
set "T=%Archiv%\%~1"  

:Loop
if not exist "%T%" goto :DoIt  
set /a Nr+=1
set "T=%Archiv%\%~1_%Nr:~-3%"  
goto :Loop

:DoIt
echo %S% --^> %T%
copy "%S%" "%T%" >nul  
goto :eof
Falls im Zielordner bereits eine gleichnamige Datei vorhanden sein sollte, wird eine dreistellige laufende Nummer an die neu kopierte Datei angefügt.

Die Zeile 21 22 soll den Bearbeitungsfortschritt dokumentieren und kann bei Nichtgefallen ersatzlos gestrichen werden. [Edit] Wie von Biber (thx) unten schon angemerkt, meinte ich natürlich tatsächlich die Zeile 22 ... [/Edit]

Grüße
bastla

P.S.:
@timobeil: Wenn ich müssen müsste würde ich vermutlich ohnehin nicht wollen können ... face-wink

... aber schön, dass Du Dich um mich sorgst. face-smile
Member: Biber
Biber Jan 17, 2009 at 18:14:49 (UTC)
Goto Top
Zitat von @schikopix:
Hallo Biber,

danke fürs Kopfwaschen :-]

bemühe mich um Besserung!

Gruß

schikopix
Moin schikopix,

danke fürs Feedback - dann habe ich alles erreicht, was ich erhofft habe.
Das war aber hoffentlich auch "im Sinne des Forums".

Dann kann ich ja jetzt das vorhin mühsam zurückgehaltene Lob nachreichen:
Das Problem ist verständlich und sauber beschrieben und auf Anhieb im richtigen Bereich gelandet.
Wenn Du jetzt demnächst auch noch die -Formatierungsmöglichkeiten entdeckst, dann steht einem konstruktiven Umgang nichts mehr im Wege.

Schönes Wochenende
Biber

P.S. bastla meinte Zeile 22 und nicht 21.
Member: schikopix
schikopix Jan 17, 2009 at 18:30:18 (UTC)
Goto Top
Hallo Bastla,
schon mal herzlichen Dank für Deine Mühe!
Ich komme leider erst morgen dazu das auszuprobieren, und melde mich dann!
schikopix
Member: schikopix
schikopix Jan 18, 2009 at 06:18:25 (UTC)
Goto Top
Hallo Bastla,
leider habe ich es noch nicht hinbekommen....... face-sad
Habe mir den Quelltext anzeigen lassen, in Editor kopiert, und als datei.bat gespeichert? Wenn ich die Datei ausführe, läuft zwar was ab, aber so schnell, dass ich es nicht lesen kann.
wenn ich die obigen Zeilen direkt in die eingabeaufforderung kopiere kommt:
"%%i" kann syntaktisch an dieser Stelle nicht verarbeitet werden.??
was mache ich bitte falsch?

Grüße
schikopix
Member: bastla
bastla Jan 18, 2009 at 08:46:20 (UTC)
Goto Top
Hallo schikopix!
Habe mir den Quelltext anzeigen lassen, in Editor kopiert, und als datei.bat gespeichert? Wenn ich die Datei ausführe, läuft zwar was ab, ...
Bis hierher völlig ok.
... aber so schnell, dass ich es nicht lesen kann.
Mein Fehler - ich teste Batches immer von der Eingabeaufforderung aus (was ich auch Dir empfehlen würde - auch, weil dann ev Fehlermeldungen leichter zu erkennen sind), und hatte daher nicht daran gedacht, Dir die Zeit zum Lesen der Ausgaben zu verschaffen. Das lässt sich aber leicht ändern: Füge vor der Zeile 7 ("goto :eof") noch eine Zeile mit "pause" ein.

wenn ich die obigen Zeilen direkt in die eingabeaufforderung kopiere kommt:
"%%i" kann syntaktisch an dieser Stelle nicht verarbeitet werden.??
Abgesehen davon, dass, wegen der Schleife und dem verwendeten Unterprogramm eine Ausführung der einzelnen Zeilen in der Eingabeaufforderung keinen Sinn machen und das so nicht funktionieren würde, wären die Schleifenvariablen %%i und %%a dann mit jeweils nur einem Prozentzeichen zu schreiben.
Eine Information fehlt mir in Deiner Rückmeldung: Wurde denn etwas kopiert?

Falls nein, ändere bitte das "echo off" in der ersten Zeile auf "echo on" und starte den Batch an der Eingabeaufforderung. Es werden dann alle Zeilen vor der Ausführung angezeigt (und zwar mit bereits "aufgelösten" Variablen, sodass also etwa anstelle von "%List%" bereits "G:\text.txt" zu lesen ist) - so sollte sich dem Fehler auf die Spur kommen lassen.

Grüße
bastla
Member: schikopix
schikopix Jan 18, 2009 at 10:54:01 (UTC)
Goto Top
Hallo Bastla,

sorry daß cih nciht erwähnt hae, dass nichts kopiert wird...

ich habe sowohl die pause eingfügt, als auch die datei die ich jetzt new5.bat genannt habe und auch nach G:\ kopiert habe an der eingabeaufforderung aufgerufen (siehe unten) ich habe auch den zielordner mal geändert auf einen ordner auf C:\ aber das hat auch nichts geändert. Die Liste text.text habe ich gekürzt auf 3 Einträge..

Nochmal: die zu kopierenden dateien liegen in Ordnern unterhalb von ...\RAW
G: ist eine externe Festplatte die über eSATA angeschlossen ist. Im Moment teste ich das unter Vista, brauche es aber auch in XP


Microsoft Windows [Version 6.0.6001]
Copyright (c) 2006 Microsoft Corporation. Alle Rechte vorbehalten.

C:\Users\Peter>G:

G:\>new5

G:\>set "Source=G:\Sabrina_06_2009\RAW"

G:\>set "Archiv=G:\ziel"

G:\>set "List=G:\text.txt"

G:\>for /F "usebackq delims=" %i in ("G:\text.txt") do call :ProcessFile "%i"

G:\>call :ProcessFile "S9065481"

G:\>for /F "delims=" %a in ('dir /s /b "G:\Sabrina_06_2009\RAW\S9065481"') do se
t "S=%a"
Das System kann den angegebenen Pfad nicht finden.

G:\>set /a Nr=1000

G:\>set "T=G:\ziel\S9065481"

G:\>if not exist "G:\ziel\S9065481" goto :DoIt

G:\>echo --> G:\ziel\S9065481
--> G:\ziel\S9065481

G:\>copy "" "G:\ziel\S9065481" 1>nul

G:\>goto :eof

G:\>call :ProcessFile "S9065613"

G:\>for /F "delims=" %a in ('dir /s /b "G:\Sabrina_06_2009\RAW\S9065613"') do se
t "S=%a"
Das System kann den angegebenen Pfad nicht finden.

G:\>set /a Nr=1000

G:\>set "T=G:\ziel\S9065613"

G:\>if not exist "G:\ziel\S9065613" goto :DoIt

G:\>echo --> G:\ziel\S9065613
--> G:\ziel\S9065613

G:\>copy "" "G:\ziel\S9065613" 1>nul

G:\>goto :eof

G:\>call :ProcessFile "S9067644"

G:\>for /F "delims=" %a in ('dir /s /b "G:\Sabrina_06_2009\RAW\S9067644"') do se
t "S=%a"
Das System kann den angegebenen Pfad nicht finden.

G:\>set /a Nr=1000

G:\>set "T=G:\ziel\S9067644"

G:\>if not exist "G:\ziel\S9067644" goto :DoIt

G:\>echo --> G:\ziel\S9067644
--> G:\ziel\S9067644

G:\>copy "" "G:\ziel\S9067644" 1>nul

G:\>goto :eof

G:\>pause
Drücken Sie eine beliebige Taste . . .

so sieht das dann aus, kopiert wird nichts, das Verzeichnis ziel existiert und ist immer noch leer....?Ich habe auch versucht die liste iext.txt so zu editieren, dass die Dateierweiterungen mit in der Liste stehen also z.B. S9067644.cr2 aber ohne Erfolg.

Wenn Du da also nochmal bitte drauschauen würdest ?

Grüße

schikopix
Member: bastla
bastla Jan 18, 2009 at 11:05:11 (UTC)
Goto Top
Hallo schikopix!

Sag doch bitte noch ein wenig mehr über die Dateien, vor allem:
  • Haben diese immer die Erweiterung ".cr2"?
  • Kann es mehrere gleichnamige Dateien in verschiedenen Unterordnern geben, und wenn ja, sollen dann (vermutlich) alle kopiert werden?

Grüße
bastla
Member: schikopix
schikopix Jan 18, 2009 at 11:31:08 (UTC)
Goto Top
Hallo Bastla,

-die zu findenden Dateien haben alle die Erweiterung .cr2 (genauer CR2, aber ich weiss nicht, ob das wichtig ist?)
-innerhalb der Struktur gibt es keine gleichnamigen Dateien (derzeit)

--

prinzipiell gibt es jeden Dateinamen einmal als .jpg und einmal als .CR2
es wäre super wenn beide kopiert werden würden, wenn das Programm beide findet bzw. wenn beide in der Struktur vorhanden sind.
(Ist aber derzeit bei den Testläufen nicht der Fall, und auch nicht zwingend notwendig, ich kann die auch getrennt halten)
Member: bastla
bastla Jan 18, 2009 at 12:10:07 (UTC)
Goto Top
Hallo schikopix!

Versuch's mal damit:
@echo off & setlocal
set "Source=G:\Sabrina_06_2009\RAW"  
set "Archiv=G:\ziel"  
set "List=G:\text.txt"  
set "Ext=.CR2"  

for /f "usebackq delims=" %%i in ("%List%") do call :ProcessFile "%%i"  
pause
goto :eof

:ProcessFile
for /f "delims=" %%a in ('dir /s /b "%Source%\%~1%Ext%"') do set "S=%%a" & call :ProcessSingleFile %1  
goto :eof

:ProcessSingleFile
set /a Nr=1000
set "T=%Archiv%\%~1%Ext%"  

:Loop
if not exist "%T%" goto :DoIt  
set /a Nr+=1
set "T=%Archiv%\%~1_%Nr:~-3%%Ext%"  
goto :Loop

:DoIt
echo %S% --^> %T%
copy "%S%" "%T%" >nul  
goto :eof
Grüße
bastla
Member: schikopix
schikopix Jan 18, 2009 at 13:40:16 (UTC)
Goto Top
Hallo Bastla,

leider schon wieder ohne Erfolg
beim starten per Doppelklick kommt:

"Das System kann den angegebenen Pfad nicht finden."
(und zwar 3 mal)

Habe es dann nochmal mit Echo on versucht und in der eingabeaufforderung die Datei (jetzt:new8.bat) aufgerufen:

Microsoft Windows [Version 6.0.6001]
Copyright (c) 2006 Microsoft Corporation. Alle Rechte vorbehalten.

C:\Users\Peter>G:

G:\>new8

G:\>set "Source=G:\Sabrina_06_2009\RAW"

G:\>set "Archiv=G:\ziel"

G:\>set "List=G:\text.txt"

G:\>set "Ext=.CR2"

G:\>for /F "usebackq delims=" %i in ("G:\text.txt") do call :ProcessFile "%i"

G:\>call :ProcessFile "S9065481.CR2"

G:\>for /F "delims=" %a in ('dir /s /b "G:\Sabrina_06_2009\RAW\S9065481.CR2.CR2"
') do set "S=%a" & call :ProcessSingleFile "S9065481.CR2"
Das System kann den angegebenen Pfad nicht finden.

G:\>goto :eof

G:\>call :ProcessFile "S9065613"

G:\>for /F "delims=" %a in ('dir /s /b "G:\Sabrina_06_2009\RAW\S9065613.CR2"') d
o set "S=%a" & call :ProcessSingleFile "S9065613"
Das System kann den angegebenen Pfad nicht finden.

G:\>goto :eof

G:\>call :ProcessFile "S9067644"

G:\>for /F "delims=" %a in ('dir /s /b "G:\Sabrina_06_2009\RAW\S9067644.CR2"') d
o set "S=%a" & call :ProcessSingleFile "S9067644"
Das System kann den angegebenen Pfad nicht finden.

G:\>goto :eof

G:\>pause
Drücken Sie eine beliebige Taste . . .

G:\>goto :eof

G:\>

völlig ratlose Grüße

schikopix
Member: bastla
bastla Jan 18, 2009 at 14:09:44 (UTC)
Goto Top
Hallo schikopix!

Führe bitte folgendes durch:
dir /s /b /a-d "G:\Sabrina_06_2009\RAW\*.CR2"
und poste das Ergebnis (soweit es sich nicht um sensible Daten oder eine seeehr lange Liste handelt) unter Verwendung der (die im Übrigen auch für das Posten von Batches oder Ablaufprotokollen zu empfehlen wäre).

Du kannst auch selbst ganz gezielt nach zB "G:\Sabrina_06_2009\RAW\S9067644.CR2" per CMD-Befehl
dir /s /b "G:\Sabrina_06_2009\RAW\S9067644.CR2"
und im Explorer suchen - eigentlich dürftest Du die Datei nicht finden. Falls sie doch vorhanden ist, kontrolliere im Explorer in den Eigenschaften, ob sie als "Versteckt" gekennzeichnet ist bzw per CMD:
attrib "HierVollständigerPfadZurDatei"
Es sollte nur das Attribut "A" (oder noch nicht einmal dieses) angezeigt werden.
Deine "test.txt" müsste so aussehen:
S9065481
S9065613
S9067644
Stelle sicher, dass keine weiteren Inhalte - speziell Leerzeichen - nach den Dateinamen folgen (sollte aber schon in der aktuellen Fassung nicht der Fall sein) und lasse auch in der ersten Zeile die Dateierweiterung weg.

Grüße
bastla
Member: schikopix
schikopix Jan 18, 2009 at 15:57:44 (UTC)
Goto Top
Hallo Bastla,

es funktioniert doch, Hurra!
Leerzeichen war das Stichwort!
Ich habe die Datei im Explorer gefunden aber über den CMD nicht, was einfach daran lag, dass sich in den übergordneten Ordnernamen ein Leerzeichen befand, das ich übersehen hatte:
so war der Ordner: Sabrina_06_ 2009 und nicht wie ich glaubte Sabrina_06_2009....
Nachdem ich dann den Pfad in der Batch Datei angepasst hatte, hat es prima funktioniert.
Vielen herzlichen Dank, und sorry, dass ich das nicht eher gemerkt habe...
ich hätte die Ausgabe auf den dir 'Befehl' auch nicht posten können weil in diesem RAW Verzeichnis ca 3200 Dateien in 30 Unterordnern liegen, sonst wär mir ja auch das Raussuchen nicht zu doof, und di batch Datei würde mir nicht in Zukunft so viel Zeit sparen!

schönen Abend! Ich freue mich!

schikopix

PS: und das mit dem lerne ich hoffentlich auch noch !
Member: bastla
bastla Jan 18, 2009 at 16:09:04 (UTC)
Goto Top
Hallo schikopix!

Ich freue mich!
Ich mich auch. face-smile

PS: und das mit dem lerne ich hoffentlich auch noch !
Dann bliebe eigentlich nur noch der Wunsch offen, dass Du diesen Beitrag als "How can I mark a post as solved?" kennzeichnen mögest ... face-wink

Grüße
bastla
Member: mipruss
mipruss Feb 27, 2020 at 09:18:14 (UTC)
Goto Top
Hallo,

vielen Dank für das Skript!
Was muss ich im Skript ändern, um nach Dateien zu suchen, die bestimmte Zeichen enthalten?
In der TXT liste ich z.B. unsere Artikelnummer "0815" auf, die Dateinamen der Bilder können aber auch wie folgt aussehen:
- "0815_vorne" oder
- "hinten_0815" oder nur
- "0815"

Hier das aktuell verwendete Skript:
@echo off & setlocal

set "Source=C:\Users\mipruss\Desktop\Bildersuche\Quellordner"
set "Archiv=C:\Users\mipruss\Desktop\Bildersuche\archiv"
set "List=C:\Users\mipruss\Desktop\Bildersuche\Bilderliste.txt"
set "Ext=.*"

for /f "usebackq delims=" %%i in ("%List%") do call :ProcessFile "%%i"

pause

goto :eof


:ProcessFile
for /f "delims=" %%a in ('dir /s /b "%Source%\%~1%Ext%"') do set "S=%%a" & call :ProcessSingleFile %1

goto :eof


:ProcessSingleFile
set /a Nr=1000
set "T=%Archiv%\%~1%Ext%"


:Loop
if not exist "%T%" goto :DoIt
set /a Nr+=1
set "T=%Archiv%\%~1_%Nr:~-3%%Ext%"

goto :Loop


:DoIt
echo %S% --^> %T%
copy "%S%" "%T%" >nul

goto :eof



Besten Dank!