blueberry
Goto Top

Flach kopieren

Hallo Zusammen

Ich habe ein Problem und zwar habe ich keine Ahnung, wie ich flach kopieren kann... Ich hab bei Robocopy, xcopy und copy geschaut und auch probiert, aber es geht irgendwie nichts...

Es geht darum, dass wir in der Firma jetzt gerade eine Migration machen und ich dazu ein Script schreiben muss, dass die Dateien in eine andere Struktur bringen soll und da gewiesse Ordner hinzukommen, aber auch viele wegfallen und da ich nicht jede Datei einzeln angeben möchte, müsste ich dazu flachkopieren können, damit die unterverzeichnisse wegfallen... Habt ihr eine Idee, wie ich das machen kann bzw. ob es da evtl. Tools gibt??
Danke euch für alle Antworten!

Grüsse Blueeberry

Content-ID: 128022

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

Ausgedruckt am: 25.11.2024 um 17:11 Uhr

Snowman25
Snowman25 27.10.2009 um 14:03:12 Uhr
Goto Top
Ich an deiner stelle würde erst mal prüfen, wo sich Dateinamen überschneiden.

Dieses Script hat besagt rekursion. Richtig angepasst sollte es dir bei deinem problem behilflich sein
@ECHO OFF
IF [%1]==[/?] (
 Echo Graphically displays the folder structure of a drive or path.
 Echo Usage: %~nx0 [/dasf] [drive:][path] [ [/dasf] [drive:][path] ...]
 Echo   /d:  show File Dates
 Echo   /a:  Show File Attributes
 Echo   /s:  Show FileSizes
 Echo   /f:  Show Files in Directories
 Echo   /t:  Use Tree.com format
 Echo   /c:  Use compact format - negates /t
 Echo.
 GOTO :EOF
)

(SET Hasfiles=) & (SET Root=)
Set Params=/
Goto :GotSwitch

:ParseParams
SHIFT
SET PARAMS=%~0
If "%PARAMS%"=="" (IF "%ROOT%"=="" (SET PARAMS=.) ELSE (GOTO :DONE))  
IF "%PARAMS:~0,1%"=="/" GOTO :GOTSWITCH  
IF "%PARAMS:~0,1%"=="-" GOTO :GOTSWITCH  
SET Root=%PARAMS%
CALL :Root "%ROOT%"  
GOTO :ParseParams
:GOTSWITCH
(SET COMPACT=) & (SET SHOWDATE=) & (SET SHOWATTRIB=) & (SET SHOWSIZES=) & (SET SHOWFILES=) & (SET TREESTYLE=)
:NEXTSWITCH
SET PARAM=%PARAMS:~0,1%
SET PARAMS=%PARAMS:~1%
IF /I [%PARAM%]==[d] SET SHOWDATE=True
IF /I [%PARAM%]==[a] SET SHOWATTRIB=True
IF /I [%PARAM%]==[s] SET SHOWSIZES=True
IF /I [%PARAM%]==[f] SET SHOWFILES=True
IF /I [%PARAM%]==[t] SET TREESTYLE=True
IF /I [%PARAM%]==[c] SET COMPACT=True
IF NOT [%PARAMS%]== GOTO :NEXTSWITCH
IF /I [%COMPACT%]==[True] (SET TREESTYLE=)
GOTO :ParseParams

:Done
pause
GOTO :EOF
:ROOT
ECHO.
REM ~ ECHO Showdate=%Showdate%
REM ~ ECHO SHOWATTRIB=%SHOWATTRIB%
REM ~ ECHO SHOWSIZES=%SHOWSIZES%
REM ~ ECHO SHOWFILES=%SHOWFILES%
REM ~ ECHO FileSing=%FileSing%
REM ~ ECHO FileMult=%FileMult%
REM ~ ECHO DirSing=%DirSing%
REM ~ ECHO DirMult=%DirMult%
REM ~ goto :EOF

ECHO %~f1
:WalkTree
SETLOCAL
:: Set up Remainder of switches -- ME DirSpec |[|...] FileSpec
REM ~ Echo Params: %*
IF NOT [%1]== PUSHD %1
SET RECURPIPE=%~2

(SET LASTDIR=) & (SET LASTFILE=)
For /D %%D in (*.*) DO SET LASTDIR=%%D
FOR %%F in (*.*) DO SET LASTFILE=%%F
REM ~ Echo LastFile=%LASTFILE%
REM ~ Echo LastDir =%LASTDIR%
REM ~ ECHO RecursivePipe %RECURPIPE% Multi %FILEMULT% single %FILESING%
IF /I [%TREESTYLE%]==[True] (
 (Set VPAD=True) & (SET PADDING=) & (SET SPC=   ) & (SET FileSing=) & (SET FileMult=) & (SET DirSing=ÀÄÄÄ) & (SET DirMult=ÃÄÄÄ) & (SET DIRPAD=®DIR¯   )
) ELSE (
 (Set VPAD=True) & (SET PADDING= ) & (SET SPC=  ) & (SET FileSing=À) & (SET FileMult=Ã) & (SET DirSing=Ô) & (SET DirMult=Æ) & (SET PipeCHR=³) & (SET DIRPAD=®DIR¯   )
)
IF /I [%COMPACT%]==[True] (Set VPAD=) & (SET PADDING=) & (SET SPC=) & (SET FileSing=À) & (SET FileMult=Ã) & (SET DirSing=Ô) & (SET DirMult=Æ) & (SET PipeCHR=³) & (SET DIRPAD=ÍÍÍÍÍ   )
IF /I NOT [%SHOWFILES%]==[True] (Set VPAD=)

IF "%TREESTYLE%"=="True" (  
 IF "%LASTDIR%"=="" (  
  (SET Pipe=%RECURPIPE%%FILEMULT%%SPC%) & (SET Pipend=%RECURPIPE%%FILESING%%SPC%) & (SET VPADDING=%RECURPIPE%)
 ) ELSE (
  (SET Pipe=%RECURPIPE%%PIPECHR%%SPC%) & (SET Pipend=%RECURPIPE%%PIPECHR%%SPC%) & (SET VPADDING=%RECURPIPE%%PIPECHR%)
 )
) ELSE (
 IF "%LASTDIR%"=="" (  
  (SET Pipe=%RECURPIPE%%FILEMULT%) & (SET Pipend=%RECURPIPE%%FILESING%) & (SET VPADDING=%RECURPIPE%)
 ) ELSE (
  (SET Pipe=%RECURPIPE%%FILEMULT%) & (SET Pipend=%RECURPIPE%%FILEMULT%) & (SET VPADDING=%RECURPIPE%%PIPECHR%)
 )
)
IF [%3]== (SET Pipend=%PIPE%)

IF /I [%SHOWFILES%]==[True] FOR %%F in (*.*) DO (
 IF "%LASTFILE%"=="%%F" (CALL :PrintFile "%PIPEND%" "%%F") ELSE (CALL :PrintFile "%PIPE%" "%%F")  
)

IF NOT "%LASTFILE%"=="" IF /I [%VPAD%]==[True] ECHO.%VPADDING%  

(SET Pipe=%RECURPIPE%%DIRMULT%) & (Set Pipend=%RECURPIPE%%DIRSING%)
(SET Pipecarry= ) & (SET LASTFILE=)


For /D %%D in (*.*) DO if "%LASTDIR%"=="%%D" (  
 CALL :PrintFile "%PIPEND%" "%%D"  
 CALL :WalkTree "%%D" "%RECURPIPE%%PIPECARRY%%SPC%" "%LASTDIR%"  
) ELSE (
 CALL :PrintFile "%PIPE%" "%%D"  
 CALL :WalkTree "%%D" "%RECURPIPE%%PIPECHR%%SPC%" "%LASTDIR%"  
)


POPD
ENDLOCAL
GOTO :EOF

:PrintFile
(SET FILESIZE=) & (Set ATTRIBS=)
(Set ATTRIBS=%~a2 )
IF [%SHOWDATE%]==[True] (Set DATTIME=%~t2 )
(Set FILESIZE=%~z2       )
SET FILESIZE=%FILESIZE:~0,7%
IF 999999 LSS %~z2 (Set FILESIZE=%~z2)
(Set FILESIZE=%FILESIZE% )
IF /I "%ATTRIBS:~0,1%"=="d" (SET FILESIZE=%DIRPAD%)  
IF NOT [%SHOWSIZES%]==[True] (Set FILESIZE=)
IF NOT [%SHOWATTRIB%]==[True] (Set ATTRIBS=)
:: Files with illegal characters need to stay quoted
SET FNAME=%2
SET FNAME=%FNAME:&=%
:: Filenames with parentheses break IF blocks
IF [%FNAME%]==[%2] GOTO :DropQuotes
SET FNAME=%2
Goto :Print
:DropQuotes
SET FNAME=%~2
:Print
ECHO %~1%PADDING%%DATTIME%%ATTRIBS%%FILESIZE%%FNAME%
IT-Muscle
IT-Muscle 27.10.2009 um 14:03:19 Uhr
Goto Top
also wenns Dir wirklich nur ums kopieren geht wäre ein Tool wie Puresync doch was für Dich!?.. da kann man glaube ich ohne Verzeichnisse die kompletten Inhalte kopieren!

probiers einfach mal aus.. ansonsten müsste es doch aber auch mit xcopy gehen?.. wenn ich mich nicht irre kopiert er doch erst mit xcopy /E die gesamte Verzeichnisstruktur mit oder?
Blueberry
Blueberry 27.10.2009 um 14:10:01 Uhr
Goto Top
Hallo Snowman25

Erstmal, danke viel mals für deinen Batch!
Bezüglich den überschneidungen, dieses Problem ist schon behoben... Und stellt im Moment kein Problem dar.

Kann man da auch mehrere dateien mitgeben, es sind ein paar Tausend Files die Kopiert werden... Wenn ja, was für einen Seperator hast du eingebaut?

Grüsse Blueeberry
Snowman25
Snowman25 27.10.2009 um 14:16:10 Uhr
Goto Top
Nunja, das Script ist nicht von mir. Es ist praktisch der batch-nachbau der Tree.com (welche wesentlich schneller läuft).
Du müsstest jetzt praktisch die Rekursion aus dem Programm extrahieren und das dann mit dem xcopy befehl koppeln...
ITIL-Harry
ITIL-Harry 27.10.2009 um 15:10:40 Uhr
Goto Top
jap - das macht es aber auch ohne /E - mit /E kopiert er leere Verzeichnisse mit
Also: einfach /E weglassen und die leeren Verzeichnisse sind am Ziel nicht da.
56844
56844 27.10.2009 um 15:54:59 Uhr
Goto Top
Moin Moin,

mal etwas am Thema Script vorbei, aber trotzdem...

Der TotalCommander besitzt auch so eine Fähigkeit.
Zumindest kann man dann alle Dateien in allen Unterverzeichnissen sehen, und damit auch kopieren.
Aber ich glaube nicht das man das per Script steuern kann.

Hat mir trotzdem schon manchmal geholfen.
Gerade beim Suchen nach Dateien deren Namen man nicht kennt face-smile

Vielleicht hilfts ja noch Jemandem.

Gruß Marcel
60730
60730 27.10.2009 um 22:29:12 Uhr
Goto Top
naabend

auch wenn das nicht ganz so viele Rems wie das vom Schneeman hat, das sollte es doch auch tun.

:para
set quelle = "c:\somefiles"  
set ziel = "c:\tempo"  

if not exist %quelle% goto end
if not exist %ziel% md "%ziel%"  
@for /f "tokens=*" %%a in ('dir /b /s "%quelle%\*.*"') do @(  
         @xcopy /h /i /c /k /d  "%%a" "%ziel%" >nul  
)
:end

Gruß
Snowman25
Snowman25 29.10.2009 um 09:31:26 Uhr
Goto Top
jetzt hab ich mir nochmal die Hilfe von for angeschaut und dann bemerkt, dass das ja auch einfacher geht. Sogar ein Einzeiler
for /D %a in (*) do copy "%a" C:\Test  
Einfach im root ausführen und alles wird 'flach' kopiert

hmm... da fehlt noch was... grade bemerkt, dass dann nur die erste Ebene Ordner durchlaufen wird

Update:
for /R /D %a in (*) do copy "%a" C:\Test  
funktioniert. Wenn du willst, kannst du ja noch den xcopy von Timo nehmen
Blueberry
Blueberry 02.11.2009 um 11:11:42 Uhr
Goto Top
Hallo Zusammen

Ich danke euch für eure Lösungen!