Move all files within subfolders to parent folder
Okay, I finally figured it out by adapting code from yet another question. Thanks to @AFH for clarifying the parts I was unsure about in the comments to this answer, and for his general help with it - it's much appreciated.
To Extract All Files from Subfolders to their Parent Folder
for /r "PARENTFOLDER" %d in (*.*) do move "%d" "PARENTFOLDER"
Remember to replace all instances of PARENTFOLDER
with the path to the folder that you want to extract the files to.
To Extract All Files from Subfolders and Delete Empty Subfolders
It's unlikely you'll need to keep the empty subfolders left over after extracting the files from them - I certainly didn't - so the below command automates the deletion of them, too.
for /r "PARENTFOLDER" %d in (*.*) do move "%d" "PARENTFOLDER" && cd "PARENTFOLDER" && for /f "delims=" %d in ('dir /s /b /ad ^| sort /r') do rd "%d"
Once again, replace all instances of PARENTFOLDER
with the path to the folder that you want to extract the files to.
By this point, however, it's no longer a one-liner, and starts to get a bit convoluted when pasted into the command line, so it's easier to just put the whole thing in a batch file. Using variables for the path to the parent folder allows you to replace just the one instance of PARENTFOLDER
at the beginning of the file, and it's also the safer option, preventing against any accidental deletion of empty folders that you might want to keep.
The Batch File
Paste into a text file, replace PARENTFOLDER
with the path to the folder you want it to work with, and save it with the .bat
extension. Run in any directory.
@ECHO OFF
SETLOCAL
SET parent="PARENTFOLDER"
CD /d %parent%
FOR /r %parent% %%d IN (*.*) DO MOVE "%%d" %parent%
FOR /f "delims=" %%d IN ('DIR /a:d /s /b ^| SORT /r') DO RD "%%d"
ECHO Done. Press any key to terminate script.
PAUSE >NUL
Related videos on Youtube
Hashim Aziz
Updated on September 18, 2022Comments
-
Hashim Aziz over 1 year
Firstly, I'm aware there are tons of similar questions, and I know because I must have tried adapting at least 5 of them, but I'm still here asking because my crappy grasp of CMD (which I actually thought I was getting good at up until this point) is frustrating me with generic, unhelpful errors, and I can't understand what part of the syntax is wrong. This is likely due to the fact that other questions deal with the folder/filename structures of their respective OPs, and when I try to adapt the code to my own folder/file structure it refuses to work. Therefore, I'm here asking for a CMD
for
loop solution that'll actually work for my own file and folder structure.I have a parent folder which contains many other folders, in which there are files:
Parent Folder Subfolder File1 File2 Subfolder File1 File2 Subfolder File1 File2
...and so on.
I'm wanting to use a CMD
for
loop in combination with themove
command to extract all the files in the subfolders to the parent folder, leaving each subfolder empty.When giving the CMD
for
loop please break down what each part of the command is doing, as this'll help make sure I understand the code and hopefully minimise the trouble I have getting it to work for myself.-
Admin over 7 yearswhat if you did
dir /s/b >a.a
to get a list of all files, one per line. Then youmove
at the beginning of each line, andc:\blah\myparentfolder
at the end of each line then you have a list of command and can name the file blah.bat and run it
-
-
AFH over 7 yearsThe
for
command syntax is not rational, but the first%d
definesd
as the loop variable, and the second%d
is what the loop variable expands to on each pass of the loop (Unix syntax is more rational:for ... d in ... do ...
). The first instance is not expanded, so it does not need quoting, unlike after thedo
, where%d
may expand to file names with embedded blanks. There is nothing special aboutd
: any single letter could be used, butd
is logical for directories (orf
for files). Even more irrationally,%%d
must be used in a batch (.cmd
or.bat
) file. -
Hashim Aziz over 7 yearsThanks for the acknowledgement that it's not rational, @AFH, I felt like it was just me that was missing something. One more thing - there are some files in the parent folder, and because of how the command above is written, it wastes time copying those files into the directory they're already in. There also appears to be some sort of bug that makes it hang there for a while. How would the command be modified to leave files in the parent directory alone, and only drill down into its sub-folders? Feel free to answer under this one or post as a separate answer.
-
AFH over 7 yearsWithout testing, I think you want a nested
for
, along the lines offor /d %d in (PARENTFOLDER\*) do for /r "%d" %f in (*.*) do move "%f" TARGETLOCATION
. If you include the extra requirements into your question, I'll submit an answer, for the benefit of others. -
Hashim Aziz over 7 yearsThat doesn't seem to work. What it does is run the nested
for
loop a set number of times. Testing on a parent folder with 7 subfolders and 3 files in it, I noticed that running it as above tends to result in 2 runs of the nestedfor
command. When enclosing the first path in double quotes within the parentheses, it runs it 7 times - same as the amount of subfolders in the parent folder. On each occasion though, and no matter how many times they're run, none of those nestedfor
loops work to acually extract files from subfolders; everything stays unchanged. Really odd. -
AFH over 7 yearsIf
PARENTFOLDER
contains blanks, it will need to be quoted. I suggest you put anecho
between the firstdo
and the secondfor
, to check exactly what nestedfor
command would be executed. Your conditions have so many possible variants that I can't set up a representative test here. -
Hashim Aziz over 7 yearsOkay, I'd always assumed that where there are parentheses, quotes wouldn't be needed, but that's clearly not the case, and it seems like that might be part of the problem judging from the output I'm getting by the echo - it's only interpreting parts of the directory names. I've included the quotes and this time the nested for loops runs a lot more time, but is still ineffective, so I'll get back to you as soon as I've figured out what exactly it's doing. It's also worth mentioning that both the PARENTFOLDER AND TARGETLOCATION in this case are the same places, for whatever that's worth.
-
AFH over 7 yearsIf you don't quote
PARENTFOLDER
and it's something likename with spaces
, the firstfor
will evaluate asfor /d %d in (name with spaces\*) do ...
, sod
will become successivelyname
,with
, then any files matching the maskspaces\*
. Parentheses do not stop the requirement to quote. The only time you needn't quote is with thecd
command, which takes the rest of the line as a single parameter, including any spaces (thoughTab
expansion inserts quotes);md
andrd
can act on multiple directories, so need quotes if the names have spaces. -
Hashim Aziz over 7 yearsI can't really make sense of the output from the CMD command, so I've pasted it here: pastebin.com/etrmhGu7.
-
AFH over 7 yearsThe log looks like what I would expect. I simulated it here (without the
echo
) by creating directories and files, and it seemed to do what I understand you want. -
Hashim Aziz over 7 yearsSorry for the late reply. It worked fine in the end, looked like all I needed was a fresh eye on it. Must have been getting the paths confused. Anyway, I've updated the answer to make it clearer and more intuitive for anyone else. Thanks again for your help.
-
AFH over 7 yearsI'm glad you have solved it.