|
Answer» I am a designer. I need to move files that are all present in one folder to folders that are of the file names. The files are of two formats, .PSD and .jpg. I need a batch file that will read the file name, make a folder of part of that file name and move all files that start with that file name into that folder regardless the extension.
For example, if I have 12 files named as
20.psd 20.jpg 20_low.jpg 20_mob.jpg
220.psd 220.jpg 220_low.jpg 220_mob.jpg
120.psd 120.jpg 120_low.jpg 120_mob.jpg
I need a batch file that will make folders 20, 220 and 120 and move all the respective files into the respective folders. So, files 20.psd, 20.jpg, 20_low.jpg and 20_mob.jpg will be in folder named 20 and so on. I tried various links on stackoverflow.com but i couldnt find anything that works. Please help. This is a very monotonous and time consuming job and having a simple program to do my job is useful! :-p
For this i tried these programs with the basic language that i have about dos programming and using examples from STACK OVERFLOW.
http://stackoverflow.com/questions/11441317/need-a-script-to-create-folders-based-on-file-names-and-auto-move-files http://stackoverflow.com/questions/19992530/batch-create-folders-based-on-part-of-file-name-and-move-files-into-that-folder
Now the problem i am facing with this code is that this isnt the kind of file name i am using. Also, there is no division as such in the file name. What can i do to make this work?http://stackoverflow.com/questions/6120623/how-to-extract-number-from-string-in-batch
This should help with a little modificationsAssumes: folders do not exist already, and no identically named files will ever exist Can remove lines starting with echo for quiet operation Put batch script in top folder with extension .bat Wil make folders under this
Code: [Select]@echo off for %%F in (*.psd *.jpg) do ( for %%A in (%%F) do ( echo File found: %%A echo Creating dir "\%%~nA" md "%%~nA" move "%%A" "%%~nA" ) ) echo Finished pause Please ignore above. Unfortunately I did not read your requirement carefully enough. Sorry. This script creates a folder for either the full file name, or if it contains an underscore, the part before the underscore. As before, you can remove or comment out all the lines starting with echo, and if you do not want the script to wait for a keypress at the end, you can do likewise with the final "pause" command.
@echo off setlocal enabledelayedexpansion for %%A in (*.psd *.jpg) do ( echo file found %%A for /f "delims=" %%B in ("%%A") do set fname=%%~nB for /f "delims=" %%C in ("%%A") do set fextn=%%~xC for /f "tokens=1* delims=_" %%D in ("!fname!") do set folname=%%D echo folder name !folname! if not exist "!folname!" ( echo Folder !folname! does not exist, creating md "!folname!" ) else ( echo Folder !folname! exists ) echo Moving file %%A to folder !folname! move "%%A" "!folname!" ) echo Finished pause
Tested with these files in the same folder as the batch:
apple.jpg apple.psd bear.jpg bear.psd cat.jpg cat.psd cat_low.jpg cat_low.psd cat_mob.jpg cat_mob.psd
Batch output:
file found apple.psd folder name apple Folder apple does not exist, creating Moving file apple.psd to folder apple 1 file(s) moved. file found bear.psd folder name bear Folder bear does not exist, creating Moving file bear.psd to folder bear 1 file(s) moved. file found cat.psd folder name cat Folder cat does not exist, creating Moving file cat.psd to folder cat 1 file(s) moved. file found cat_low.psd folder name cat Folder cat exists Moving file cat_low.psd to folder cat 1 file(s) moved. file found cat_mob.psd folder name cat Folder cat exists Moving file cat_mob.psd to folder cat 1 file(s) moved. file found apple.jpg folder name apple Folder apple exists Moving file apple.jpg to folder apple 1 file(s) moved. file found bear.jpg folder name bear Folder bear exists Moving file bear.jpg to folder bear 1 file(s) moved. file found cat.jpg folder name cat Folder cat exists Moving file cat.jpg to folder cat 1 file(s) moved. file found cat_low.jpg folder name cat Folder cat exists Moving file cat_low.jpg to folder cat 1 file(s) moved. file found cat_mob.jpg folder name cat Folder cat exists Moving file cat_mob.jpg to folder cat 1 file(s) moved. Finished Press any key to continue . . .
Files after run:
\apple\apple.jpg \apple\apple.psd \bear\bear.jpg \bear\bear.psd \cat\cat.jpg \cat\cat.psd \cat\cat_low.jpg \cat\cat_low.psd \cat\cat_mob.jpg \cat\cat_mob.psd
You don't actually need this line, but it won't do any harm:
for /f "delims=" %%C in ("%%A") do set fextn=%%~xCSalmon,
Good job, I wasn't sure that the underscore was standard. The Link I posted would go through each file name character by character and strip out only the numbers so no matter what the file name is as long as it GRAB the digits and from there he can create the directory and move the files. But if the naming convention is as simple as having a underscore after the numbers or not yours script should work perfectly.Thanks a lot everyone! I will try each of your ideas and let youll know! thanks a ton again! Youll have saved me from a lot of boring monotonous work.
@ Salmon - Just so that i can learn, can you explain the logic of how you came up with the code? And can you also explain the code to me???@ Salmon,
The batch file works like a breeze!! Thank you very much my friend! I owe you real big! If you do get the time, can you please explain how you came up with the program and the syntax bit of dos?
Thanks@Salmon
I hope you don't mind
@echo off
:: Needed because you are working with variables that are immediately called setlocal enabledelayedexpansion
:: Start of the loop to get all files with a psd or jpg Extension for %%A in (*.psd *.jpg) do ( echo file found %%A
:: Grabs only the file name for /f "delims=" %%B in ("%%A") do set fname=%%~nB
:: Grabs only the extension for /f "delims=" %%C in ("%%A") do set fextn=%%~xC
:: Using the File name it separates it into 2 part using "_" as a delimiter so 120_low becomes 120 and low for /f "tokens=1* delims=_" %%D in ("!fname!") do set folname=%%D echo folder name !folname!
:: Checks for the existence of the folder, if the folder does not exist it creates the folder if not exist "!folname!" ( echo Folder !folname! does not exist, creating md "!folname!" ) else ( echo Folder !folname! exists )
:: Moves the file to the folder echo Moving file %%A to folder !folname! move "%%A" "!folname!" ) echo Finished
It's nice and clean in comparison to what I had in mind Kudos to SalmonQuote from: erobby on November 15, 2015, 10:14:34 AM :: Needed because you are working with variables that are immediately called setlocal enabledelayedexpansion
erobby, a good effort. I would just add a bit more about delayed expansion. We need to enable delayed expansion because of the behaviour of variables which are both set and expanded inside a loop or other structure with brackets such as IF blocks - consider this code
setlocal enabledelayedexpansion if %foo%==%bar% ( set var=YES echo Var is !var! )
If you used %var% then if it did not exist before the IF block or loop then nothing would get echoed (the variable would be empty); if it did exist you would get the previous value befor the script got to the bracket structure. For this reason we enable delayed expansion and use EXCLAMATION marks instead of percent symbols. This is because cmd.exe expands all normal percent variables before running and variables inside loops are created and changed at run time. This is something that changed from MS-DOS.
This brings me to what some may feel is a minor point (I have had arguments about this!) namely using double colons to start a comment line. This was OK in MS-DOS under command.com but it has the potential to break Windows NT family scripts running under cmd.exe. It is unofficial and unsupported. The comment line starter is REM (case-insensitive). The reason I don't like double colons is that a double colon is really just a broken label and you can't have them inside a loop. A loop or other bracket structure is really just one line to to the commmand interpreter and any label will break that. (The script will crash)
Hello
I have the same problem as the Topic Starter and Salmons solution is nearly perfect for me, except for one thing. Some of my file names contain exclamation marks and these file can't be moved by the script. I think the problem is "setlocal enabledelayedexpansion" but I'm new to batch scripting so I hope someone can help me solve this problem. Thanks.I didn't evaluate this at all - and it's untested. I merely simplified the code as I read it.
Code: [Select]@echo off for %%A in (*.psd *.jpg) do ( for /f "tokens=1* delims=_" %%D in ("%%~nA") do ( md "%%D" 2>nul echo Moving file %%A to folder %%D move "%%A" "%%D" >nul )) echo Finished pause
|