George Hernando
George Hernando

Reputation: 2650

Windows Batch move to directory that may not exist

In a Windows batch file I am trying to move a file to a directory which may not currently exist. Because the directory is not there, when I do the move I see an error like:

The system cannot find the path specified

move c:\aaa\bbb\ccc\ddd\myfile.txt c:\aaa\111\222\333\444\mytext.txt

How can I easily create the path that I want to move to if it doesn't currently exist? For example here, directory 111 may not exist yet under aaa. I want the whole path structure to be created and then the file moved.
I had thought that it would just create the whole path for me as part of the move.

Upvotes: 29

Views: 43246

Answers (6)

Damian Vogel
Damian Vogel

Reputation: 1192

Continuing on johvs answer: I really love the idea, but if you have a larger number of files this will not work due to performance limitations. It took ~8.5s per file, and I have about 3mio files to move, which makes a total computation time of roughly ten months. With this option out of the field I have found this 2-step-solution - first copy the folder structure, and only then copy the files:

  1. xcopy C:\source C:\target /t /e
  2. move C:\source\aaa\bbb\ccc\ddd\myfile.txt C:\target\111\222\333\444\mytext.txt

This obviously has the disadvantage that it will create unnecessary folders, but for my purpose it's not an issue.

Upvotes: 0

johv
johv

Reputation: 4594

Continuing on Aruns answer:

md c:\aaa\111\222\333\444\mytext.txt
rd c:\aaa\111\222\333\444\mytext.txt
move c:\aaa\bbb\ccc\ddd\myfile.txt c:\aaa\111\222\333\444\mytext.txt

This creates a folder called mytext.txt and its parents, and then deletes it, but not the parents.

More fun:

call :move_md "c:\aaa\bbb\ccc\ddd\myfile.txt" "c:\aaa\111\222\333\444\mytext.txt"
call :move_md "c:\aaa\bbb\ccc\ddd\myfile1.txt" "c:\aaa\111\222\333\444\mytext4.txt"
call :move_md "c:\aaa\bbb\ccc\ddd\myfile2.txt" "c:\aaa\111\222\333\444\mytext5.txt"
call :move_md "c:\aaa\bbb\ccc\ddd\myfile3.txt" "c:\aaa\111\222\333\444\mytext6.txt"
goto :eof

:move_md
md %2
rd %2
move %1 %2
goto :eof

Upvotes: 6

aphoria
aphoria

Reputation: 20209

If ROBOCOPY is an option, it will create the folder structure if it doesn't exist.

Try this:

ROBOCOPY c:\aaa\bbb\ccc\ddd c:\aaa\111\222\333\444 mytext.txt /MOV

Upvotes: 27

jsshah
jsshah

Reputation: 1741

Lets say you have the following directory structure.

C:\aaa\bbb\ccc\ddd

you want to create a directory called 111 under aaa, then 222 under 111, then 333 under 444 and so on

Window's cmd allows you to create a directory structure by providing multi level path

thus md c:\aaa\111\222\333\444 will create all the directory till 444.

You may want to create the directory first and then perform the move

Upvotes: 2

Bali C
Bali C

Reputation: 31251

if not exist c:\aaa\111\222\333\444 md c:\aaa\111\222\333\444
Move c:\aaa\bbb\ccc\ddd\myfile.txt c:\aaa\111\222\333\444\mytext.txt

Upvotes: 10

Arun
Arun

Reputation: 2533

Try:

md c:\aaa\111\222\333\444 2> nul

before your Move command.

md makes directories recursive, so if there are no parent directories to 444, it will keep creating hierarchically. The "2> nul" ensures that if you have the directory already, your command wouldnt error out.

Upvotes: 28

Related Questions