I have a folder with files x_blah.blah y_ho.hum z_hi.ho which I just need to drop everything to left of the underscore and the underscore from so I'm left with blah.blah ho.hum hi.ho
+2
A:
Windows Batch
@echo off
FOR %%i in (PREFIX*.txt) DO (set file=%%i) & CALL :rename
GOTO :eof
:rename
REN "%file%" "%file:~6%"
GOTO :eof
You need to adjust the 6 to the length of the prefix. So for your example, you could do this:
@echo off
FOR %%i in (x_*.txt) DO (set file=%%i) & CALL :rename
GOTO :eof
:rename
REN "%file%" "%file:~2%"
GOTO :eof
Linux
Linux has multiple solutions, one of them would be this:
rename 's/^x_//' *
where x_ is the prefix.
poke
2010-10-12 21:13:25
No this is in a batch file with many other things that needs to be ran every minute.
2010-10-12 21:14:11
Ah, okay, adjusted the answer.
poke
2010-10-12 21:38:51
+1
A:
This should do the trick:
setlocal enabledelayedexpansion
for %%i in (*_*) do (
set old_name=%%i
set new_name=!old_name:*_=!
move "!old_name!" "!new_name!"
)
For explanation:
setlocal enabledelayedexpansionenables the so called delayed variable expansion, a feature that e.g. allows you to dereference variables inside loopsfor %%i in (*_*) dostarts a loop over all file names inside the current directory that at least have one_and assigns that file name to the loop variable%%iset old_name=%%iassigns the content of the loop variable to a regular variable namedold_nameset new_name=!old_name:*_=!does some nice string substitution on the content of the variableold_name, replacing all characters before the first_and the_itself with nothing. The result is stored innew_name. See the help of the SET command for more details (typehelp seton the command line).move "!old_name!" "!new_name!"finally is the command issued to rename each file from its old to its new name
Update:
To go through the files in all sub folders you can use the FOR /R variation of the for loop. To start in the current directory, change the loop header to something like:
for /r %%i in (*_*) do (
But you also need to take into account that the loop variable now contains the fully qualified path of the file name, so you also have to change the loop body a bit to only substitute the file name:
for /r %%i in (*_*) do (
set file_path=%%~dpi
set old_file_name=%%~nxi
set new_file_name=!old_file_name:*_=!
move "!file_path!!old_file_name!" "!file_path!!new_file_name!"
)
Hope that helps.
Frank Bollack
2010-10-12 22:15:21
This is what I need, thanks. One more question. I have several folders in the same directory. Is there anything I can add to go through all those folders without having to copy and paste this several times and keep changing directories and hardcoding the folder names?
2010-10-12 23:54:09
Using * in string substitution is new to me, Its in set /?, but well buried.
Andy Morris
2010-10-13 11:02:00