Loek
Loek

Reputation: 13

Batch move files in folders to newly created folders

I want to move all files in some folders to a newly created folder in that same folder. For easier understanding, see the example below (the input is shown left, output is shown right):

C:\1\A\file1.tif            C:\1\A\Named\file1.tif
       file2.tif                         file2.tif
       file3.tif     ==>                 file3.tif
C:\1\B\file1.tif            C:\1\B\Named\file1.tif
       file2.tif                         file2.tif
       file3.tif                         file3.tif

In the example above, I have only shown the first three files in every folder, but the total number may vary (usually there are 1000 files per folder). Also, I have only shown two folders (A and B), but the total number of folders may vary as well (usually about 10 folders). Finally, I have only shown the folder '1', but the number of these kind of folders may also vary (usually '1' through '10'). So I was looking to a script that could do these actions independent of the number of files or folders, and independent of the names of the folders/files (I chose '1', 'A' and 'file1.tif' only as examples).

The idea is that, now, I have to manually create empty folders (called 'Named' in the example above) in each folder ('A' and 'B' in the example above) where the files are. Then I have to manually move all the files into that newly created folder 'Named'. I have to do this for all folders (about 100). I can do this entire process manually if I had to do it only once, but the thing is that I have to do this process many times :-). So automating this would save a lot of time.

Does anyone know a script that can do this? Thanks a lot!

Upvotes: 1

Views: 1404

Answers (2)

Bali C
Bali C

Reputation: 31221

After thorough testing, this works great. However, as it is a lot of files, you may want to set up a little test environment, like in your example, to use this on first, before you use it on your actual data.

setlocal enabledelayedexpansion
cd C:\rootfolder
for /f "tokens=*" %%a in ('dir /s /b /a:d') do (
attrib "%%a\*.*" | find "File not found"
if !errorlevel!==1 (
if not exist "%%a\Named" md "%%a\Named"
xcopy "%%a\*.*" "%%a\Named"
del "%%a\*.*" /f /q
)
)

Upvotes: 0

rene
rene

Reputation: 42414

tested a little, this might work, in a command file

make a cmd file with these lines

for /r %%a in (*.*) do  call :singlecopy %%a
goto :eof

:singlecopy
set src=%~p1
set dst=%~p1NAMED
set file=%~n1%~x1
rem replace NAMED in src with nothing
set srctst=%src:NAMED=%
rem if src and srctst are still the same, copy 
if %srctst%==%src%  robocopy %src%  %dst% %file% /move /create
goto :eof

Upvotes: 1

Related Questions