Dateien gleichen Namens in verschiedene Unterordner kopieren
Moderators: Hacker, Stefan2, white
Dateien gleichen Namens in verschiedene Unterordner kopieren
Hallo,
Ich möchte innerhalb meiner Ordnerstruktur alle Dateien mit dem Namen "Poster.jpg" eine Ebene tiefer in einen oder mehrer Unterordner kopieren und nicht löschen . Es sind ca. 950 "Poster.jpg" verschiedener Motive (passend zum Hauptordner), die in entweder einen oder mehrere Unterordner (2500) müssen.
Meine Ordnerstruktur sieht so aus:
C:/Foto/Haus/Poster.jpg
C:/Foto/Haus/unterordener1
C:/Foto/Haus/unterordener2
C:/Foto/Auto/Poster.jpg
C:/Foto/Auto/unterordner3
C:/Foto/Auto/unterordner4
C:/Foto/Auto/unterordner5
Und noch einiges mehr.
Wie geht dies ohne viel Aufwand? Kann mir bitte jemand helfen?
Ich möchte innerhalb meiner Ordnerstruktur alle Dateien mit dem Namen "Poster.jpg" eine Ebene tiefer in einen oder mehrer Unterordner kopieren und nicht löschen . Es sind ca. 950 "Poster.jpg" verschiedener Motive (passend zum Hauptordner), die in entweder einen oder mehrere Unterordner (2500) müssen.
Meine Ordnerstruktur sieht so aus:
C:/Foto/Haus/Poster.jpg
C:/Foto/Haus/unterordener1
C:/Foto/Haus/unterordener2
C:/Foto/Auto/Poster.jpg
C:/Foto/Auto/unterordner3
C:/Foto/Auto/unterordner4
C:/Foto/Auto/unterordner5
Und noch einiges mehr.
Wie geht dies ohne viel Aufwand? Kann mir bitte jemand helfen?
Re: Dateien gleichen Namens in verschiedene Unterordner kopi
Hallo und willkommen.
Also jede "Poster.jpg" in alle direkt darunterliegende Unterordner (nur eine Ebene) kopieren?
Und der Name "Poster.jpg" ist immer derselbe?
In den Unterordner sind bisher keine "Poster.jpg" vorhanden?
Pseudo code:
1.
-- Für jeden Ordner
-- -- Wenn "Poster.jpg" existiert
-- -- -- kopiere "Poster.jpg" in alle direkten Unterordner als "Poster.jpg.tmp"
2.
-- Für jeden Ordner REN "Poster.jpg.tmp" "Poster.jpg"
Etwa so?
--- EDIT
Ach so!
Laut deinem Beispiel hast nur eine Ebenentiefe von 2:
C:/Foto/Haus/Poster.jpg
C:/Foto/Haus/unterordener1
C:/Foto/Haus/unterordener2
"Haus" sowie "unterordenerX"
Somit würde der TMP-Name sowie der zweite Durchgang entfallen.
obmiz wrote:Ich möchte innerhalb meiner Ordnerstruktur
alle Dateien mit dem Namen "Poster.jpg"
eine Ebene tiefer
in einen oder mehrer Unterordner kopieren
Also jede "Poster.jpg" in alle direkt darunterliegende Unterordner (nur eine Ebene) kopieren?
Und der Name "Poster.jpg" ist immer derselbe?
In den Unterordner sind bisher keine "Poster.jpg" vorhanden?
Pseudo code:
1.
-- Für jeden Ordner
-- -- Wenn "Poster.jpg" existiert
-- -- -- kopiere "Poster.jpg" in alle direkten Unterordner als "Poster.jpg.tmp"
2.
-- Für jeden Ordner REN "Poster.jpg.tmp" "Poster.jpg"
Etwa so?
--- EDIT
Ach so!
Laut deinem Beispiel hast nur eine Ebenentiefe von 2:
C:/Foto/Haus/Poster.jpg
C:/Foto/Haus/unterordener1
C:/Foto/Haus/unterordener2
"Haus" sowie "unterordenerX"
Somit würde der TMP-Name sowie der zweite Durchgang entfallen.
Last edited by Stefan2 on 2016-02-25, 19:08 UTC, edited 1 time in total.
BATCH Kopiere Datei in alle Unterordner
Wie oft benötigst du diesen Befehl?
Für einmalige Ausführung (und einfache Unterordnertiefe):
Ausgangssituation:
- gehe zu C:/Foto/
- Erstelle ein Backup!
- öffne eine DOS-Box Kommandozeile
- kopiere diesen Befehl ein
[face=timesnewroman]For /F "tokens=*" %H in ('dir /B /AD') DO @For /F "tokens=*" %U in ('dir "%H" /B /AD') DO @IF NOT EXIST "%H\%U\Poster.jpg" COPY "%H\Poster.jpg" "%H\%U\Poster.jpg"[/face]
ERKLÄRUNG:
Für jeden %Hauptordner, liste jeden %Unterordner und kopiere %H\Datei nach %H\%U\
ERGEBNIS:
- - -
Alternativen:
Kopiere Poster.jpg zu ALBUM.jpg
For /F "tokens=*" %H in ('dir /B /AD') DO @For /F "tokens=*" %U in ('dir "%H" /B /AD') DO @IF NOT EXIST "%H\%U\ALBUM.jpg" COPY "%H\Poster.jpg" "%H\%U\%ALBUM.jpg"
Kopiere Poster.jpg zu <ordnername>_COVER.jpg
For /F "tokens=*" %H in ('dir /B /AD') DO @For /F "tokens=*" %U in ('dir "%H" /B /AD') DO @IF NOT EXIST "%H\%U\%U_COVER.jpg" COPY "%H\Poster.jpg" "%H\%U\%U_COVER.jpg"
Für einmalige Ausführung (und einfache Unterordnertiefe):
Ausgangssituation:
Code: Select all
c:\Foto>tree /F /A
C:.
+---Auto
| | Poster.jpg
| +---unterordner3
| +---unterordner4
| \---unterordner5
|
\---Haus
| Poster.jpg
+---unterordener1
\---unterordener2
c:\Foto>
- gehe zu C:/Foto/
- Erstelle ein Backup!
- öffne eine DOS-Box Kommandozeile
- kopiere diesen Befehl ein
[face=timesnewroman]For /F "tokens=*" %H in ('dir /B /AD') DO @For /F "tokens=*" %U in ('dir "%H" /B /AD') DO @IF NOT EXIST "%H\%U\Poster.jpg" COPY "%H\Poster.jpg" "%H\%U\Poster.jpg"[/face]
ERKLÄRUNG:
Für jeden %Hauptordner, liste jeden %Unterordner und kopiere %H\Datei nach %H\%U\
ERGEBNIS:
Code: Select all
c:\Foto>tree /F /A
C:.
+---Auto
| | Poster.jpg
| +---unterordner3
| | Poster.jpg
| +---unterordner4
| | Poster.jpg
| \---unterordner5
| Poster.jpg
\---Haus
| Poster.jpg
+---unterordener1
| Poster.jpg
\---unterordener2
Poster.jpg
c:\Foto>
- - -
Alternativen:
Kopiere Poster.jpg zu ALBUM.jpg
For /F "tokens=*" %H in ('dir /B /AD') DO @For /F "tokens=*" %U in ('dir "%H" /B /AD') DO @IF NOT EXIST "%H\%U\ALBUM.jpg" COPY "%H\Poster.jpg" "%H\%U\%ALBUM.jpg"
Kopiere Poster.jpg zu <ordnername>_COVER.jpg
For /F "tokens=*" %H in ('dir /B /AD') DO @For /F "tokens=*" %U in ('dir "%H" /B /AD') DO @IF NOT EXIST "%H\%U\%U_COVER.jpg" COPY "%H\Poster.jpg" "%H\%U\%U_COVER.jpg"
Last edited by Stefan2 on 2016-02-26, 08:38 UTC, edited 6 times in total.
Danke!
Was heißt HTH?
Es geht nicht. Es kommt "Datei nicht gefunden". Liegt es daran, dass die UNterordner Leerzeichen und 1 Bindestrich im Namen haben?
Entschuldigung: Die übergeordneten Ordner haben auch Leerzeichen und Teilweise Bindestrich.
Ich habe grade Probeweise einen Ordner ohne Leerzeichen und ohne Bindestrich umbenannt. Dann geht es. Tur mir leid, dass ich mich unnpräzise ausgedrückt habe. Würdest du mir bitte den Code abändern, dass es auch mit Leerzeichen und Bindestrich funktioniert??
Was heißt HTH?
Es geht nicht. Es kommt "Datei nicht gefunden". Liegt es daran, dass die UNterordner Leerzeichen und 1 Bindestrich im Namen haben?
Entschuldigung: Die übergeordneten Ordner haben auch Leerzeichen und Teilweise Bindestrich.
Ich habe grade Probeweise einen Ordner ohne Leerzeichen und ohne Bindestrich umbenannt. Dann geht es. Tur mir leid, dass ich mich unnpräzise ausgedrückt habe. Würdest du mir bitte den Code abändern, dass es auch mit Leerzeichen und Bindestrich funktioniert??
[quote="Stefan2"
HTH?
Hope that helps?
[/quote]
... und wie. Perfekt. Danke für deine prima Hilfe. Hätte mich sonst bestimmt einen Tag gekostet, die ganzen Datei per Hand zu kopieren.
Auch, wenn es spät ist.... Kann man (du) das als Batch-Datei machen? Wäre für mich auf Dauer einfacher, als mit der Kommandozeile.
HTH?
Hope that helps?
[/quote]
... und wie. Perfekt. Danke für deine prima Hilfe. Hätte mich sonst bestimmt einen Tag gekostet, die ganzen Datei per Hand zu kopieren.
Auch, wenn es spät ist.... Kann man (du) das als Batch-Datei machen? Wäre für mich auf Dauer einfacher, als mit der Kommandozeile.
Du kannst den Befehl direkt in einen TC-Button eingeben.
Oder in die usercmd.ini eintragen (Forumsuche oder > http://ghisler.ch/board/viewtopic.php?p=291895#291895)
Aber dabei die Prozentzeichen verdoppeln!
TC Button inkl. Kommando (Code kopieren, auf einen freien Platz der Buttonbar mit rechter Maustaste einfügen):
Der Code wird im jeweils gerade aktiven Panel (sprich Ordner) ausgeführt.
Bei Interesse: rechter Maustaste auf den neuen Button und "Ändern" wählen.
Im Dialog die F1-Taste drücken und lesen...
- - -
Aber du kannst auch eine Batch haben.
Aber dabei die Prozentzeichen verdoppeln!
Zum Beispiel:
Der Code wird im jeweils gerade aktiven Panel (sprich Ordner) ausgeführt.
Kopiere_Poster-jpg.CMD
TC Button zum Aufrufen der Batch:
Falls die Batchdatei im TC-Ordner liegt, kann man sie auch "portable" aufrufen:
"%Commander_Path%\Kopiere_Poster-jpg.CMD"
Oder etwa:
"%Commander_Path%\MeineTools\Batch\Kopiere_Poster-jpg.CMD"
Oder in die usercmd.ini eintragen (Forumsuche oder > http://ghisler.ch/board/viewtopic.php?p=291895#291895)
Aber dabei die Prozentzeichen verdoppeln!
TC Button inkl. Kommando (Code kopieren, auf einen freien Platz der Buttonbar mit rechter Maustaste einfügen):
Code: Select all
TOTALCMD#BAR#DATA
cmd /c
For /F "tokens=*" %%H in ('dir /B /AD') DO @For /F "tokens=*" %%U in ('dir "%%H" /B /AD') DO @IF NOT EXIST "%%H\%%U\Poster.jpg" COPY "%%H\Poster.jpg" "%%H\%%U\Poster.jpg"
C:\Windows\system32\cmd.exe
Kopiere jede Poster.jpg in alle Unterordner
-1
Der Code wird im jeweils gerade aktiven Panel (sprich Ordner) ausgeführt.
Bei Interesse: rechter Maustaste auf den neuen Button und "Ändern" wählen.
Im Dialog die F1-Taste drücken und lesen...
- - -
Aber du kannst auch eine Batch haben.
Aber dabei die Prozentzeichen verdoppeln!
Zum Beispiel:
Der Code wird im jeweils gerade aktiven Panel (sprich Ordner) ausgeführt.
Kopiere_Poster-jpg.CMD
Code: Select all
@ECHO OFF
ECHO Kopiere_Poster-jpg.CMD
REM Der Code wird im jeweils gerade aktiven Panel (sprich Ordner) ausgeführt.
ECHO Kopiere jede Poster.jpg in alle Unterordner
REM http://ghisler.ch/board/viewtopic.php?p=305529#305529
ECHO Start-Ordner: %CD%
ECHO Strg+C zum Abbrechen. Beliebige Taste zum fortfahren.
PAUSE
REM Kopiere diese Datei:
SET inFILE=Poster.jpg
REM Zu diesem neuen Namen:
SET toFILE=Poster.jpg
For /F "tokens=*" %%H in ('dir /B /AD') DO @For /F "tokens=*" %%U in ('dir "%%H" /B /AD') DO @IF NOT EXIST "%%H\%%U\%toFILE%" COPY "%%H\%inFILE%" "%%H\%%U\%toFILE%"
TC Button zum Aufrufen der Batch:
Code: Select all
TOTALCMD#BAR#DATA
cmd /c
"D:\rive\pfad\zur\Kopiere_Poster-jpg.CMD"
C:\Windows\system32\cmd.exe
Kopiere jede Poster.jpg in alle Unterordner
-1
Falls die Batchdatei im TC-Ordner liegt, kann man sie auch "portable" aufrufen:
"%Commander_Path%\Kopiere_Poster-jpg.CMD"
Oder etwa:
"%Commander_Path%\MeineTools\Batch\Kopiere_Poster-jpg.CMD"
Last edited by Stefan2 on 2016-02-25, 21:47 UTC, edited 1 time in total.
Ich habe nun alle "poster.jpg" kopiert. Er schmeißt mir viermal die Meldung aus, dass keine Datei kopiert werden konnte. Bei der Masse der Ordner (3500) kann ich nicht manuell nachsehen, wo die poster.jpg fehlt. Hast du eine Ahnung, wie ich da mit der Suchfunktion in TC nach einer fehlenden poster.jpg suchen kann ??
Finde Ordner, in denen die Datei nicht existiert
Habe ich momentan nicht parat. Eine Forumsuche könnte helfen.obmiz wrote:Hast du eine Ahnung, wie ich da mit der Suchfunktion in TC nach einer fehlenden poster.jpg suchen kann ??
Ich würde einfach die Kommandozeile bemühen:
STEP 1:
ALLE UNTERORDNER auflisten nach "_AlleOrdner.txt":
C:\Fotos Ordner\>dir /B /S /AD > _AlleOrdner.txt
C:\Fotos Ordner\Auto
C:\Fotos Ordner\Haus
C:\Fotos Ordner\Auto\unterordener1
C:\Fotos Ordner\Auto\unterordener2
C:\Fotos Ordner\Auto\unterordner3
C:\Fotos Ordner\Auto\unterordner4
C:\Fotos Ordner\Auto\unterordner5
C:\Fotos Ordner\Haus\unterordener1
C:\Fotos Ordner\Haus\unterordener2
STEP 2:
ALLE Unterordner MIT POSTER.jpg auflisten nach " _MitPoster.txt":
C:\Fotos Ordner\>dir /B /S Poster.jpg > _MitPoster.txt
C:\Fotos Ordner\Auto\Poster.jpg
C:\Fotos Ordner\Auto\unterordener2\Poster.jpg
C:\Fotos Ordner\Auto\unterordner3\Poster.jpg
C:\Fotos Ordner\Auto\unterordner5\Poster.jpg
C:\Fotos Ordner\Haus\Poster.jpg
C:\Fotos Ordner\Haus\unterordener2\Poster.jpg
STEP 3:
Lösche die Zeichenkette "\Poster.jpg" aus der Auflistung von STEP 2,
um beide Inhalte vergleichen zu können,
durch Suchen&Ersetzen im Texteditor:
Ergebnis:
C:\Fotos Ordner\Auto
C:\Fotos Ordner\Auto\unterordener2
C:\Fotos Ordner\Auto\unterordner3
C:\Fotos Ordner\Auto\unterordner5
C:\Fotos Ordner\Haus
C:\Fotos Ordner\Haus\unterordener2
(Oder verwende gleich SED:
C:\Fotos Ordner\>dir /B /S Poster.jpg | busybox sed "s/\\Poster.jpg//" > _MitPoster.txt)
STEP 4:
Vergleiche beide Textdateien mit TC-Menü > Vergleiche nach Inhalt.
Dazu beide Textdateien auswählen und den Menüpunkt anwählen.
Falls das nicht der Richtige sein sollte, tippe cm_IntCompareFilesByContent in die TC-Kommandozeile ein.
Oder in der DOS-Box:
C:\Fotos Ordner\>busybox diff _MitPoster.txt _AlleOrdner.txt | find "+"
+++ _AlleOrdner.txt
@@ -1,5 +1,7 @@
+C:\Fotos Ordner\Haus
+C:\Fotos Ordner\Auto\unterordner4
+C:\Fotos Ordner\Haus\unterordener1
Die busybox für Win32 findet man zB hier >> http://frippery.org/busybox/
# # # # ##
Oder mit PowerShell (ohne externe Tools wie busybox)
In C:\Fotos Ordner\ öffne eine PoSh-Box
und tippe ein (jede Zeile mit ENTER abschließen)
(Oder markiere alle drei Zeilen zusammen und füge diese auf einmal in die PoSh-Box ein):
PoSh v4:
$A = dir -rec | %{ If($_.PSISContainer){ $_.FullName }}
$B = dir -rec Poster.jpg |%{ $_.FullName -replace("\\Poster.jpg","") }
Diff $A $B
PoSh v2 (Win7 Standard):
$A = dir -rec | %{ If($_.PSISContainer){ $_.FullName } }
$B = dir -rec -filter Poster.jpg | %{ $_.DirectoryName }
diff $A $B
(Für v2 wurde auch gleich "$_.DirectoryName" verwendet, anstelle des umständlichen "%{$_.FullName -replace("\\Poster.jpg","")}", Dank an ZoSTeR)
ERGEBNIS:
Code: Select all
InputObject SideIndicator
----------- -------------
C:\Fotos Ordner\Auto\unterordner4 <=
C:\Fotos Ordner\Haus\unterordener1 <=
Last edited by Stefan2 on 2016-02-27, 22:29 UTC, edited 3 times in total.