Назад | Перейти на главную страницу

Скопируйте первые 10 файлов из папки и подпапок

Я пытаюсь получить первые (любые) 10 файлов из глубоко вложенной файловой структуры. я могу использовать XCOPY source dest /T /E для построения структуры папок, но я бы хотел получить по 10 файлов из каждой папки и подпапки и скопировать их.

Есть ли инструмент, который сделает это за меня?

Ваш вопрос звучит так, как будто вы хотите первые 10 файлов из каждый подпапка? Это должно сделать это (не проверено полностью!):

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

Если он сохранен в пакетном файле с именем first10.cmd, вы можете использовать его следующим образом:

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

Сначала он подготавливает структуру папок назначения с помощью xcopy, как и в вашем вопросе. Затем мы сохраняем список всех папок в файл и перебираем каждую из них. Для каждой папки мы сохраняем список всех файлов в этой папке и перебираем каждый файл. Для каждого файла :docopy создает команду копирования и выполняет ее.

Если вам нужны только первые 10 файлов из всей структуры, вы можете использовать это (сильно заимствовано из ответа Оуэна!)

@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

Используйте это как:

mybatchfilename.bat "C:\Source" "C:\Target"

Я почти уверен, что вы не можете сделать это с помощью обычной команды xcopy, вам придется использовать какую-то форму скрипта, чтобы найти файлы, которые вам действительно нужны, а затем просто передать их в xcopy один за другим - это или создать один черт возьми 'исключить' строку :)