I need to randomly pick around 200 specific files from different sub folders to one folder. Following is the details: ( tree /F /A
result)
+--- source_folder
| +--- Folder A
| | module_01.x
| | module_02.x
| | module_03.x
| +--- Folder B
| | module_01.x
| | module_02.x
| | module_03.x
| +--- Folder C
| | module_01.x
| | module_02.x
| | module_03.x
I want to randomly pick 3 of them for example:
module_01.x from folder B
module_02.x from folder C
module_03.x from folder C
to "dest_folder".
Following is the code I am using but only shuttles a few and it seems always picking many files from only one folder and, when it trying to copy from another folder it won't overwrite the exist files(tried the /Y but no luck).
Any suggestions? Thank you very much!
@echo off&setlocal enabledelayedexpansion
set "source_folder=test"
set "dest_folder=output"
set /a filecount=193
del "dest_folder\*.x"
pushd "source_folder"
for /r %%i in (*.x) do set /a files+=1& set "$!files!=%%~i"
popd
pushd "dest_folder"
:randomloop
set /a rd=%random%%%files+1
set "sco=!$%rd%!"
if not defined x goto :randomloop
set "$%rd%="
for %%i in ("%x%") do if exist "%%~nxi" echo "%%~nxi" already exist in %out%.& goto:randomloop
copy "%x%" /Y
set /a filecount-=1
if %filecount% gtr 0 goto:randomloop
popd
pause
I don't understand the way you process the files... If all subfolders have the same files (as you specified in "the details"), then you don't need to process all files , but just the files from one subfolder and then, randomly select the real source subfolder...
@echo off
setlocal EnableDelayedExpansion
set "source_folder=test"
set "dest_folder=output"
del "%dest_folder%\*.x"
pushd "%source_folder%"
rem Create the subFolder array
set "n=0"
for /D %%a in (*) do (
set /A n+=1
set "subFolder[!n!]=%%a"
)
rem Process all files in first subfolder
pushd "%subFolder[1]%"
for %%a in (*.x) do (
rem Select a random subfolder
set /A "ran=!random! %% n + 1"
rem Pick the file from such random subfolder
for /F %%r in ("!ran!") do copy "..\!subFolder[%%r]!\%%a" "..\%dest_folder%"
)
EDIT : Simple test added
I tested this code in this way: I created the three folders and added four *.x files to each of them. Then, I added an ECHO
command before the copy
one, that is:
for /F %%r in ("!ran!") do ECHO copy "..\!subFolder[%%r]!\%%a" "..\%dest_folder%"
Finally I ran the program. This is the output:
copy "..\folder A\module-001.x" "..\output"
copy "..\folder C\module-002.x" "..\output"
copy "..\folder B\module-003.x" "..\output"
copy "..\folder C\module-004.x" "..\output"
This means that module-001.x
file is copied from folder A
, module-002.x
file from folder C
, module-003.x
file from folder B
, and module-004.x
file from folder C
.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.