Я пытаюсь получить первые (любые) 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 один за другим - это или создать один черт возьми 'исключить' строку :)