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
GELÖST

Dateien aus einer Liste (txt) finden und kopieren

Frage Entwicklung Batch & Shell

Mitglied: schikopix

schikopix (Level 1) - Jetzt verbinden

17.01.2009, aktualisiert 18.10.2012, 8506 Aufrufe, 17 Kommentare

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??
Mitglied: 60730
17.01.2009, aktualisiert 18.10.2012
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ß
Bitte warten ..
Mitglied: Biber
17.01.2009 um 14:51 Uhr
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
Bitte warten ..
Mitglied: schikopix
17.01.2009 um 16:20 Uhr
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?
Bitte warten ..
Mitglied: schikopix
17.01.2009 um 16:22 Uhr
Hallo Biber,

danke fürs Kopfwaschen :-]

bemühe mich um Besserung!

Gruß

schikopix
Bitte warten ..
Mitglied: bastla
17.01.2009 um 17:05 Uhr
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:
01.
@echo off & setlocal 
02.
set "Source=G:\Sabrina_06_2009\RAW" 
03.
set "Archiv=G:\ziel" 
04.
set "List=G:\text.txt" 
05.
 
06.
for /f "usebackq delims=" %%i in ("%List%") do call :ProcessFile "%%i" 
07.
goto :eof 
08.
 
09.
:ProcessFile 
10.
for /f "delims=" %%a in ('dir /s /b "%Source%\%~1"') do set "S=%%a" 
11.
 
12.
set /a Nr=1000 
13.
set "T=%Archiv%\%~1" 
14.
 
15.
:Loop 
16.
if not exist "%T%" goto :DoIt 
17.
set /a Nr+=1 
18.
set "T=%Archiv%\%~1_%Nr:~-3%" 
19.
goto :Loop 
20.
 
21.
:DoIt 
22.
echo %S% --^> %T% 
23.
copy "%S%" "%T%" >nul 
24.
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 ...

... aber schön, dass Du Dich um mich sorgst.
Bitte warten ..
Mitglied: Biber
17.01.2009 um 19:14 Uhr
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 <code>-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.
Bitte warten ..
Mitglied: schikopix
17.01.2009 um 19:30 Uhr
Hallo Bastla,
schon mal herzlichen Dank für Deine Mühe!
Ich komme leider erst morgen dazu das auszuprobieren, und melde mich dann!
schikopix
Bitte warten ..
Mitglied: schikopix
18.01.2009 um 07:18 Uhr
Hallo Bastla,
leider habe ich es noch nicht hinbekommen.......
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
Bitte warten ..
Mitglied: bastla
18.01.2009 um 09:46 Uhr
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
Bitte warten ..
Mitglied: schikopix
18.01.2009 um 11:54 Uhr
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
Bitte warten ..
Mitglied: bastla
18.01.2009 um 12:05 Uhr
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
Bitte warten ..
Mitglied: schikopix
18.01.2009 um 12:31 Uhr
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)
Bitte warten ..
Mitglied: bastla
18.01.2009 um 13:10 Uhr
Hallo schikopix!

Versuch's mal damit:
01.
@echo off & setlocal 
02.
set "Source=G:\Sabrina_06_2009\RAW" 
03.
set "Archiv=G:\ziel" 
04.
set "List=G:\text.txt" 
05.
set "Ext=.CR2" 
06.
 
07.
for /f "usebackq delims=" %%i in ("%List%") do call :ProcessFile "%%i" 
08.
pause 
09.
goto :eof 
10.
 
11.
:ProcessFile 
12.
for /f "delims=" %%a in ('dir /s /b "%Source%\%~1%Ext%"') do set "S=%%a" & call :ProcessSingleFile %1 
13.
goto :eof 
14.
 
15.
:ProcessSingleFile 
16.
set /a Nr=1000 
17.
set "T=%Archiv%\%~1%Ext%" 
18.
 
19.
:Loop 
20.
if not exist "%T%" goto :DoIt 
21.
set /a Nr+=1 
22.
set "T=%Archiv%\%~1_%Nr:~-3%%Ext%" 
23.
goto :Loop 
24.
 
25.
:DoIt 
26.
echo %S% --^> %T% 
27.
copy "%S%" "%T%" >nul 
28.
goto :eof
Grüße
bastla
Bitte warten ..
Mitglied: schikopix
18.01.2009 um 14:40 Uhr
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
Bitte warten ..
Mitglied: bastla
18.01.2009 um 15:09 Uhr
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 Code-Formatierung (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
Bitte warten ..
Mitglied: schikopix
18.01.2009 um 16:57 Uhr
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 <code> lerne ich hoffentlich auch noch !
Bitte warten ..
Mitglied: bastla
18.01.2009 um 17:09 Uhr
Hallo schikopix!

Ich freue mich!
Ich mich auch.

PS: und das mit dem <code> lerne ich hoffentlich auch noch !
Dann bliebe eigentlich nur noch der Wunsch offen, dass Du diesen Beitrag als "Gelöst" kennzeichnen mögest ...

Grüße
bastla
Bitte warten ..
Neuester Wissensbeitrag
Festplatten, SSD, Raid

12TB written pro SSD in 2 Jahren mit RAID5 auf Hyper-VServer

Erfahrungsbericht von Lochkartenstanzer zum Thema Festplatten, SSD, Raid ...

Ähnliche Inhalte
Batch & Shell
gelöst Dateien zusammenführen inkl. finden von doppelten Einträgen (3)

Frage von miczar zum Thema Batch & Shell ...

Batch & Shell
gelöst Nicht doppelt vorhandene Dateien (nur Name) finden (4)

Frage von darebo zum Thema Batch & Shell ...

C und C++
Dateien in Ordner kopieren anhand vom Teil eines Dateinamen (22)

Frage von onlyforu8373 zum Thema C und C ...

Batch & Shell
Dateien kopieren die nicht mehr verändert werden? (10)

Frage von pbelcl zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (34)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...