Copie os 10 primeiros arquivos de uma pasta e subpastas

6

Estou tentando obter o primeiro (qualquer) 10 arquivos de uma estrutura de arquivos profundamente aninhada. Eu posso usar XCOPY source dest /T /E para construir a estrutura de pastas, mas o que eu gostaria de fazer é obter 10 arquivos de cada pasta e subpasta e copiar os mesmos também.

Existe uma ferramenta que fará isso por mim?

    
por Rob White 18.02.2011 / 13:26

3 respostas

12

Sua pergunta parece que você deseja os 10 primeiros arquivos da subpasta todos ? Isso deve ser feito (não exaustivamente testado!):

echo off
xcopy /Y %1 %2 /T /E

dir %1 /b /s /A:D >tempfolderlist.txt

for /f "tokens=1 delims=¬" %%a in (./tempfolderlist.txt) do (

    dir "%%a" /b /A:-D >tempfilelist.txt

    setlocal enabledelayedexpansion

    set counter=0

    for /f "tokens=1 delims=¬" %%b in (./tempfilelist.txt) do (

        IF !counter! LSS 10 call :docopy %1 "%%a\%%b" %2
        set /a counter+=1

    )

    endlocal
)

del /q tempfolderlist.txt
del /q tempfilelist.txt
GOTO:EOF

:docopy
set sourcePath=%~1
set sourceFile=%~2
set targetPath=%~3
set sourceNoDrive=%sourceFile:~3,5000%
set sourcePathNoDrive=%sourcePath:~3,5000%
set sourceNoDrive=!sourceNoDrive:%sourcePathNoDrive%\=!

copy "%sourceFile%" "%targetPath%\%sourceNoDrive%" >> out.txt

GOTO:EOF

Se ele for salvo em um arquivo de lote chamado 'first10.cmd', você poderá usá-lo assim:

first10.cmd "C:\Temp\SourcePath" "C:\Temp\DestPath"

Primeiro, ele prepara a estrutura da pasta de destintation usando xcopy, assim como na sua pergunta. Em seguida, salvamos uma lista de todas as pastas em um arquivo e fazemos um loop sobre cada uma delas. Para cada pasta, salvamos uma lista de todos os arquivos nessa pasta e fazemos um loop sobre cada arquivo. Para cada arquivo, :docopy constrói o comando copy e o executa.

    
por 18.02.2011 / 16:27
2

Se você quiser apenas os 10 primeiros arquivos de toda a estrutura, você pode usar isso ( muito emprestado da resposta de Owen!)

@echo off

mkdir %2

dir %1 /b /s /A:-D >tempfilelist.txt

setlocal enabledelayedexpansion

set counter=0

for /f "tokens=1 delims=¬" %%b in (./tempfilelist.txt) do (

    IF !counter! LSS 10 call :docopy "%%b" %2
    set /a counter+=1
)

endlocal
)

del /q tempfilelist.txt
GOTO:EOF

:docopy
copy %1 %2

GOTO:EOF

Use como:

mybatchfilename.bat "C:\Source" "C:\Target"
    
por 18.02.2011 / 16:41
0

Estou quase certo de que você não pode fazer isso usando um comando xcopy regular, você vai ter que usar algum tipo de script para encontrar os arquivos que você realmente quer, basta passá-los para xcopy um por um - que ou construir um inferno de uma string 'exclude':)

    
por 18.02.2011 / 14:34

Tags