Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rename Files using wildcard paths

Recently I started working and my first task is to write a batch file that automatically changes filenames to filename_date with the original file-ending. For that you should be able to write paths into a textfile (e.g. paths.txt) and when you start the program, it should take any line (=path->file) from there and rename it. I got it to work on my PC quiet well but as I gave it to testing they asked to make the use of wildcards Z:\Path\*.* possible. My current code looks as follows:

@echo off
setlocal EnableDelayedExpansion
cd %~dp0    

For /F "tokens=*" %%m in (paths.txt) do (

set path=%%~dpm
set name=%%~nxm

pushd "!path!"
dir

For /r !path! %%f in (!name!) do (

set path=%%~dpf
set name=%%~nf
set ending=%%~xf
set datsave=%%~nxf

set "name=!name!_"
set "name=!name!!date:~6,4!"
set "name=!name!!date:~3,2!"
set "name=!name!!date:~0,2!"

set "name=!name!!ending!"

copy "!datsave!" "!name!"

del "!datsave!"
cls
popd
)

)

I know that a lot of it is probably easier and more efficient to do, but this is my first batch project and I am quiet happy except for the wildcard problem. So an example would be: C:\Some\Path\*.*

This line would be in paths.txt. With the splitting

set path=%%~dpf
set name=%%~nf
set ending=%%~xf
set datsave=%%~nxf

I get the following:

path: C:\Some\Path
name: C:\Some\Path
ending: -empty-
datsave: C:\Some\Path

because name is set to the Path at the start of the first FOR-Loop. But that seems to be working if I do not use wildcards.

Now the question: Why does this happen and how do I get rid of it? Or do I just use the wrong type of wildcards?

Again: This is my first time I work with batch, so it might be something simple ;)

like image 224
geisterfurz007 Avatar asked Aug 12 '16 06:08

geisterfurz007


People also ask

How do I partially rename multiple files at once?

Select multiple files in a folder. To do so, press and hold down the CTRL key while you are clicking files. After you select the files, press F2. Type the new name, and then press ENTER.

What is a wildcard filename?

Wildcards (also referred to as meta characters) are symbols or special characters that represent other characters. You can use them with any command such as ls command or rm command to list or remove files matching a given criteria, receptively.

How do you rename a file path?

To rename a file or folder:Right-click on the item and select Rename, or select the file and press F2 . Type the new name and press Enter or click Rename.


1 Answers

Ok, I figured out 2 problems and now it works

set name=%%~nxm evaluates the wildcard. Even if name is *.txt it will return bar.txt. I replaced that by a basename computation instead: set name=!name:*\=! done enough times (not very subtle but hey batch files forces us to do such things) which preserves the wildcard

The other problem is the for /R loop: after pushd, the argument needs to be . or it won't be scanned.

Last minor one: use rename instead of copy plus delete. It preserves file time and is very fast. Copying then deleting a large file can take a long time.

@echo off

set DEPTH=20
setlocal EnableDelayedExpansion
cd %~dp0    

For /F %%m in (paths.txt) do (

set pth=%%~dpm
set z=%%m
set name=!z!

rem brutal basename. We cannot break the inner loop or
rem it would break the upper loop too
for /L %%I in (1,1,%DEPTH%) do set name=!name:*\=!
rem but we can check if it is really a basename
set chkname=!name:*\=!
if not !chkname!==!name! ( echo please increase DEPTH value
pause
exit /B)

rem set name=%%~nxm
pushd "!pth!"
For /r . %%f in (!name!) do (
set pth=%%~dpf
set name=%%~nf
set ending=%%~xf
set datsave=%%~nxf

set "name=!name!_!date:~6,4!!date:~3,2!!date:~0,2!!ending!


echo renaming "!datsave!" to "!name!"
rem ren "!datsave!" "!name!"

popd
)

)
  • paths.txt contains just a line C:\full\path\to\test\*.txt
  • my test directory contains 2 text files and 1 other file

output:

renaming "bar.txt" to "bar_20160812.txt"
renaming "foo.txt" to "foo_20160812.txt"

(just uncomment the ren line to get the job done)

like image 77
Jean-François Fabre Avatar answered Nov 03 '22 01:11

Jean-François Fabre