DOS command to move all files in subdirectories one level up - windows-xp

I have a folder with a lot of sub folders with one or more files in each. I am trying to write a batch file that moves all those files to C:\songs (for example). Any help? I have already tried
C:\>FOR /R C:\Test %i IN (*) DO MOVE %i C:\Songs
The folders Test and songs exist, but I get an error saying
%i was unexpected at this time.
What am I doing wrong?

FOR /R %i IN (C:\Test\*) DO MOVE "%i" C:\Songs
In a batch file, it has to be %%i. Weird quirk of batch.

(move files in sub-directories up 1)
for /r %x in (*.*) do move "%x" "%x"/../..
(last part I usually use backward slants but this crazy thing kept deleting them for some reason. It'll work either way though)
(delete unneeded directories)
for /d /r %x in (bin) do rd "%x"
i.e., if you had a bunch of directories with files in "bin" directories under those
and you wanted to move everything up 1 and delete the "bin" directories.

Related

Batch File to copy files to new directory while renaming, skipping existing files, and without confirmation

I am creating a batch file to be run later which will be used to copy files from one location to another while renaming the files, skipping any existing files, and without prompting the user. Examples of files to be copied:
00021001.txt
00021001.xyz
00021001.abc
00021001001.jpg
Copied files will have the names:
00022001.txt
00022001.xyz
00022001.abc
00022001001.jpg
Things I have tried:
xcopy C:\Testing\1000012\21\00021*.* C:\Testing\1000013\22\00022*.* /D
This almost does it. It copies all the files starting with "00021" in the first location into the second location while properly renaming them to start with "00022". It skips all the files with the same name and date stamp, but ends up prompting to copy any files from the source which are newer than the target.
robocopy C:\Testing\1000012\21\ C:\Testing\1000013\22\ 00021*.* /xo /xn /xc
I was hoping that by excluding older, newer, and same date files it would work (even if it doesn't rename - I would just do that in a separate step.) Unfortunately, this just ends up overwriting newer source files over existing target files if they are a different filesize.
I have even tried the Copy-Item command in PowerShell. But it doesn't do the renaming like Xcopy, and it doesn't skip existing files (although I can get it to confirm and say "No to All".)
Copy-Item -Path "C:\CWUImageCompare\Testing\1000012\CWU\chemistry\129\21\00021*.*" -Destination "C:\CWUImageCompare\Testing\1000013\CWU\chemistry\129\20\" -Confirm
If xcopy had the "Skip if existing" flag I'd be all set, but it doesn't.
#ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
rem The following settings for the source directory & destination directory are names
rem that I use for testing and deliberately includes spaces to make sure
rem that the process works using such names. These will need to be changed to suit your situation.
SET "sourcedir=u:\your files"
SET "destdir=u:\your results"
FOR /f "skip=1delims=" %%b IN ('xcopy /L /Y "%sourcedir%\00021*.*" "%destdir%\00022*.*" ^|sort') DO (
SET "oname=%%~nxb"
IF EXIST "%destdir%\00022!oname:~5!" (ECHO "%%b" skipped) ELSE (ECHO COPY /y "%%b" "%destdir%\00022!oname:~5!")
)
GOTO :EOF
Always verify against a test directory before applying to real data.
Seems a little complicated, but essentially, execute the xcopy (I omitted the /D for testing) with /L /Y to simply produce a list.
Since the list has a last line that begins with a numeric, whereas the other lines start with a drive-letter, sort the list and skip the first line.
This would implement the date-requirement.
Then grab the part after the first 5 characters of the name+extension, test whether the new name exists and either report or copy as appropriate (The copy command is disarmed for testing)

Move files from multiple folders to a single folder without extension

i am a windows user and i need help with something
i have a folder and in it it has multiple folder.and in those multiple folders i have more folders and in those folder i have files without any extension like jpg,txt etc
here is a sample
D:\test\1\something1\1235486[file]
D:\test\1\something2\1235486[file]
D:\test\2\something1\1235486[file]
D:\test\2\something2\1235486[file]
so now i want to move all those random number files i.e 123456789[these files are without any extension] to D:\newtest
so i will have files like
D:\newtest\123456789
D:\newtest\123456789
D:\newtest\123456789
D:\newtest\123456789
etc. i could have easily done this with search option if it had a extension.but what can i do now?
Finally Found a solution for this problem
First make another folder where you want to transfer file
lets say i have a folder named ABC and i want to transfer its files to XYZ [only files not folders]
then open Command prompt [cmd]
and enter this
for /f "tokens=*" %a in ('dir /b /s /a-d "d:\abc"') do #copy "%a" "d:\xyz
Change the folder names and hit enter.it will transfer all the files in it

Is there any batch command to move files and delete empty sub folders

Anyone know of a simple batch command to move files and delete empty sub folders? Just got a new external and when I copied everything over it resulted in something like this. F:\Music\John Denver\John Denver\files1-10 F:\Music\TheBeatles\TheBeatles\files1-10 and so on, for say, 350+ folders. I don't want to waste that much time manually moving them up one folder and deleting sub folders... Not all files are same file type, and not all folders are music. Some folders have other sub folders that I want to keep (mostly for music files, such as artist\album\files) Is there a way to do this instead of the old fashioned way? Any help is appreciated.
You can use ROBOCOPY.
ROBOCOPY source destination /S /MOVE
/S flag is used to exclude empty subfolders.
ROBOCOPY "F:\Music\John Denver\John Denver\files1-10" "F:\Music\TheBeatles\TheBeatles\files1-10" /S /MOVE

How to use Robocopy to copy a template folder structure to other folders?

I need to copy all the folders within one folder, to multiple other folders. The folder structure I want to copy from is here:
x:\Customer1\Site1\
I want to copy all the folders within Site1, to all the folders within the following directory:
X:\Customer1\
Obviously I don't want to copy the folders back into Site1 again, only every folder within Customer1, excluding Site1.
Site1 contains 19 folders. I would like to end up having those 19 folders within every folder in the Customer1 folder. Can someone please tell me how to achieve this?
I have been looking at the Robocopy MS page to learn about all the switches and options, but there doesn't seem to be anything to help me with this 'copying folder tree from one folder to multiple folders' that I need. Please give me any reference
Many thanks
Naz
As far as I know, this is only possible with xcopy's /t-switch which copies only the folder structure (note that if you also want empty folders to get copied you have to put the '/e' -switch as well)
To copy the structure in every subfolder a for-loop is the way to go:
set customer1="X:\Customer1"
set site1="Site1"
for /f %%d in ('dir %customer1% /b /ad') do (
if %%d NEQ %site1% xcopy %customer1%\%site1%\*.* %customer1%\%%d\*.* /t /e
)

Batch file to copy all new files except the most recent

I would like to write a batch file containing DOS commands (unfortunately perl or another language is not an option) to do the following task.
In one directory (c:\MyData\Directory1) there are the following files:
File2.txt
File2.dat
FileA.bin
FileQ.bin
FileC.bin
File8.bin
File2.bin
These files all have different creation dates. The most recently created *.bin file is File2.bin in this example, but it could be any randomly named *.bin file.
In another directory (c:\MyData\Directory2) there are the following files:
File2.txt
File2.dat
FileA.bin
FileQ.bin
Here is what I want to do:
Copy all files with the extension *.bin in Directory1 that do not already exist in Directory2 except for the most recently created *.bin file in Directory1. So the only files that should be copied into Directory2 are:
FileC.bin - Copy because it's a bin file that's not yet in Directory2
File8.bin - Copy because it's a bin file that's not yet in Directory2
The following files should not be copied into Directory2:
File2.txt - Wrong extension so don't copy it
File2.dat - Wrong extension so don't copy it
FileA.bin - Already exists in Directory2 so don't copy it
FileQ.bin - Already exists in Directory2 so don't copy it
File2.bin - Most recent *.bin file so don't copy it
Thanks for any help!
#echo off
#rem Sorry for excessive commenting - I am a batch file newbie
#rem Batch file will not work if there are spaces in names of directory or copied files
#rem Next line allows for/do loop to work correctly
setlocal enabledelayedexpansion
#rem Make temporary file that lists files from newest to oldest
DIR /o-d /b c:\temp\Directory1\*.bin > FileList.txt
#rem Counter will be used to avoid copying newest file which is listed first
set /A Counter=1
#rem Read in names of all files with chosen extension in the first directory
#rem Names will be stored in the variable %%a
for /F "delims=" %%a in (C:\temp\FileList.txt) do (
#rem Increment the counter
set /A Counter+=1
#rem Only copy files that are not the most recent one, so Counter>1
#rem Requires the exclamation points because this is a string not number comparison
if !Counter! gtr 1 (
#rem If the file does not already exist in Directory2, copy it
if not exist C:\temp\Directory2\%%a (
echo Copying C:\temp\Directory1\%%a to C:\temp\Directory2\%%a
copy C:\temp\Directory1\%%a C:\temp\Directory2\%%a
)
)
)
#rem Remove the temporary file
del FileList.txt
You can use DIR *.bin /o-d /b > Files.txt to get a list of bin files ordered most recent to last. Do this on both folders (to separate output files), and then set up a FOR loop, maybe two nested FOR loops, to go through the two files, pick out the ones to copy (with special handling for the first one in the date-ordered list), and copy them from within the loop. Silly tricks would be done with setting the Attribute setting and then using XCOPY /M to copy them all at the same time, but that seems overly fussy.
I've always found FOR loops to be cantankerous beasts, and if you can find a non-batch-file way, or some form of third-party plug in to help, you'd be ahead of the game.
I don't have Robocopy on my machine, otherwise I would do a /? and tell you. But as I recall it has many more capabilities (especially wrt timestamps). It's a windows tool.
http://en.wikipedia.org/wiki/Robocopy