Dateien gleichen Namens in verschiedene Unterordner kopieren

German support forum

Moderators: Hacker, Stefan2, white

obmiz
Junior Member
Junior Member
Posts: 10
Joined: 2016-02-25, 17:36 UTC

Dateien gleichen Namens in verschiedene Unterordner kopieren

Post by *obmiz »

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?
User avatar
Stefan2
Power Member
Power Member
Posts: 4281
Joined: 2007-09-13, 22:20 UTC
Location: Europa

Re: Dateien gleichen Namens in verschiedene Unterordner kopi

Post by *Stefan2 »

Hallo und willkommen.
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.
obmiz
Junior Member
Junior Member
Posts: 10
Joined: 2016-02-25, 17:36 UTC

Post by *obmiz »

Danke für das Willkommen.
Genau so wie du es beschrieben hast:
1 eine Ebene tiefer
2 Immer poster.jpg
3 es existiert im Unterordner noch keine poster.jpg
4 jede Poster.jpg
User avatar
Stefan2
Power Member
Power Member
Posts: 4281
Joined: 2007-09-13, 22:20 UTC
Location: Europa

Post by *Stefan2 »

Ich war zu langsam ;-)

Siehe mein EDIT, stimmt dass mit nur einem Unterordner,

oder sind da noch Unter-Unterordner usw.?



 
User avatar
Stefan2
Power Member
Power Member
Posts: 4281
Joined: 2007-09-13, 22:20 UTC
Location: Europa

BATCH Kopiere Datei in alle Unterordner

Post by *Stefan2 »

Wie oft benötigst du diesen Befehl?

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.
obmiz
Junior Member
Junior Member
Posts: 10
Joined: 2016-02-25, 17:36 UTC

Post by *obmiz »

Meine Güte,
dass ist aber eine tolle prompte Bedienung. Da ist jeweils nur 1 Unterordnerebene, aber davon auch mal nur 1 oder 10 Stück.

Also:
C:/Foto/Haus/Poster.jpg
C:/Foto/Haus/unterordener1
oder
C:/Foto/Garage/Poster.jpg
C:/Foto/Garage/unterordener1
.
bis
.
C:/Foto/Garage/unterordener10
User avatar
Stefan2
Power Member
Power Member
Posts: 4281
Joined: 2007-09-13, 22:20 UTC
Location: Europa

Post by *Stefan2 »

OK, Lösung siehe mein Post vorher :D






HTH?   :roll: 8)
obmiz
Junior Member
Junior Member
Posts: 10
Joined: 2016-02-25, 17:36 UTC

Post by *obmiz »

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??
User avatar
Stefan2
Power Member
Power Member
Posts: 4281
Joined: 2007-09-13, 22:20 UTC
Location: Europa

Post by *Stefan2 »

Oh, ja.

Ich habe zwar Anführungszeichen verwendet, um Leerzeichen zu handeln, aber "tokens=*" vergessen.

Ich habe das Kommando oben angepasst.



HTH?
Hope that helps?


 
obmiz
Junior Member
Junior Member
Posts: 10
Joined: 2016-02-25, 17:36 UTC

Post by *obmiz »

[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.
User avatar
Stefan2
Power Member
Power Member
Posts: 4281
Joined: 2007-09-13, 22:20 UTC
Location: Europa

Post by *Stefan2 »

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):

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.
obmiz
Junior Member
Junior Member
Posts: 10
Joined: 2016-02-25, 17:36 UTC

Post by *obmiz »

Perfekt.
Vielen lieben Dank.
obmiz
Junior Member
Junior Member
Posts: 10
Joined: 2016-02-25, 17:36 UTC

Post by *obmiz »

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 ??
User avatar
Stefan2
Power Member
Power Member
Posts: 4281
Joined: 2007-09-13, 22:20 UTC
Location: Europa

Finde Ordner, in denen die Datei nicht existiert

Post by *Stefan2 »

obmiz wrote:Hast du eine Ahnung, wie ich da mit der Suchfunktion in TC nach einer fehlenden poster.jpg suchen kann ??
Habe ich momentan nicht parat. Eine Forumsuche könnte helfen.

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.
obmiz
Junior Member
Junior Member
Posts: 10
Joined: 2016-02-25, 17:36 UTC

Post by *obmiz »

Danke. Werde ich zu Hause ausprobieren.
Post Reply