Link to home
Start Free TrialLog in
Avatar of E=mc2
E=mc2Flag for Canada

asked on

Rename all files in a directory to numerical order

I want to rename all mp3 files in a specific directory, to 001.mp3, 002.... 165.mp3, 166.mp3 etc..
The mp3 files are in C:\mp3\
Avatar of Shaun Vermaak
Shaun Vermaak
Flag of Australia image

Using Powershell
$fileNumber = 0;
Get-ChildItem "C:\mp3" -Filter *.mp3 | 
Foreach-Object {
    Rename-Item $_.FullName "$($fileNumber).mp3";
    $fileNumber++;
}

Open in new window

Avatar of oBdA
oBdA

Powershell, including leading zeros; to change the length of the index, replace the "3" in ToString('D3').
In test mode, remove the -WhatIf in line 3 to run for real.
$Index = 1
Get-ChildItem -Path "C:\mp3\*.mp3" | ForEach-Object {
	Rename-Item -Path $_.FullName -NewName "$(($Index++).ToString('D3'))$($_.Extension)" -WhatIf
}

Open in new window

Avatar of E=mc2

ASKER

@Shaun - thanks, however after it renames the files, the content of the files does not correspond to what infact was listed as the first file, second file etc..
Perhaps the index number
$fileNumber = 1;
Get-ChildItem "C:\mp3" -Filter *.mp3 | 
Foreach-Object {
    Rename-Item $_.FullName "$($fileNumber).mp3";
    $fileNumber++;
}

Open in new window

Here is a BAT approach.

@echo off
setlocal EnableDelayedExpansion

set BaseDir=C:\mp3

for /f "tokens=1-3 delims=[]" %%B in ('dir /b /a-d /on "%BaseDir%\*.mp3"^|find /n /v ""') do (
  set Num=000%%B
  set Num=!Num:~-3!
  ECHO Renaming "%BaseDir%\%%~C" to "!Num!%%~xC"
  ren "%BaseDir%\%%~C" "!NewName[%%B]!%%~xC"
)

Open in new window

~bp
Avatar of E=mc2

ASKER

@shawn - this still did not work, unfortunately.... perhaps using the title order would be good?
Avatar of E=mc2

ASKER

@Bill - thanks Bill, however when I run the script I can tell that it thinks that there are duplicate files when infact there are not..
Do you mean based on the file name, or an mp3 tag?
Here it's sorted based on file name:
$Index = 1
Get-ChildItem -Path "C:\mp3\*.mp3" | Sort-Object -Property Name | ForEach-Object {
	Rename-Item -Path $_.FullName -NewName "$(($Index++).ToString('D3'))$($_.Extension)" -WhatIf
}

Open in new window

$fileNumber = 1;
Get-ChildItem "C:\mp3" -Filter *.mp3 | Sort-Object |
Foreach-Object {
    Rename-Item $_.FullName "$($fileNumber).mp3";
    $fileNumber++;
}

Open in new window

Avatar of E=mc2

ASKER

@obda - thanks, however this renumbers the files, with three digits, however it does not keep the corresponding audio which I am expecting in the first file which was renamed etc.. second file, third file, etc..
Then you need to tell us exactly what constitutes "first", "second", "third", etc. file. Based on which order?
Avatar of E=mc2

ASKER

Lesson 12.3.mp3
Lesson 12.5.mp3
Lesson 12.7.mp3... and so forth until..
Lesson 12.175.mp3
Lesson 12.177.mp3
Avatar of E=mc2

ASKER

In the future the names of the files will change, however this is the format..
As before, in test mode:
$Index = 1
Get-ChildItem -Path "D:\Service\PS\Lesson\*.mp3" |
	Where-Object {$_.BaseName -match '.* (?<Version>\d+\.\d+)\Z'} |
	Sort-Object @{e={[version]$Matches['Version']}} |
	ForEach-Object {
		Rename-Item -Path $_.FullName -NewName "$(($Index++).ToString('D3'))$($_.Extension)" -WhatIf
	}

Open in new window

@Bill - thanks Bill, however when I run the script I can tell that it thinks that there are duplicate files when infact there are not..

Not sure why you think that, in a small test here it wasn't generating dupes...

Renaming "b:\ee\ee29006800\files\file1.mp3" to "001.mp3"
Renaming "b:\ee\ee29006800\files\file2 xxx.mp3" to "002.mp3"
Renaming "b:\ee\ee29006800\files\file3 xxx.mp3" to "003.mp3"

That being said, since you want a file like "Lesson 12.3.mp3" to come before "Lesson 12.175.mp3", a simple sort of the existing filenames won't work for you (which is what I did) so I'll leave oBdA to work his magic and sort the version part correctly.

~bp
Avatar of E=mc2

ASKER

@oBdA - thanks again, however when I change the path of where the files are to:  Get-ChildItem -Path "C:\File\*.mp3" |, and remove the test mode.. nothing happens.. when I run the file.. I see some red characters pop up and then disappear.. no renaming of files.
@100questions,

I tested oBdA's last script here and it worked fine with and without the -WhatIf.

It did rename the files here, but it suffers from the same problem my BAT script has, in that it renamed like below, rather than true lesson order.

What if: Performing the operation "Rename File" on target "Item: B:\ee\ee29006800\files\Lesson 12.3.mp3 Destination: B:\ee\ee29006800\files\001.mp3".
What if: Performing the operation "Rename File" on target "Item: B:\ee\ee29006800\files\Lesson 12.175.mp3 Destination: B:\ee\ee29006800\files\002.mp3".
What if: Performing the operation "Rename File" on target "Item: B:\ee\ee29006800\files\Lesson 12.5.mp3 Destination: B:\ee\ee29006800\files\003.mp3".
What if: Performing the operation "Rename File" on target "Item: B:\ee\ee29006800\files\Lesson 12.7.mp3 Destination: B:\ee\ee29006800\files\004.mp3".
What if: Performing the operation "Rename File" on target "Item: B:\ee\ee29006800\files\Lesson 12.177.mp3 Destination: B:\ee\ee29006800\files\005.mp3".

Open in new window

~bp
Will all the files involved be named in the format "Lesson x.y.mp3" where x and y are integer numbers?  Or are there other variations?

~bp
Open a PS console, and start it from there, not from Explorer using "Execute".
Avatar of E=mc2

ASKER

@oBdA and BillPrew - the script runs, but again the first file does not reflect the content of the first file which was listed in the directory namely, Lesson 12.3.mp3.  So this does not work.  Also, yes the format will always be the same.  

Perhaps we need to create a directory listing of the Files directory before renaming, and then compare it to the order of the files listed in the list.txt.. and then force the renaming according to the list.txt???
Would a VBscript solution be acceptable?

~bp
Avatar of E=mc2

ASKER

Hi Bill, yes most definitely ...that would be great.
Strange; was working fine with the first and last two, and when I now added the 12.7, the order went wrong.
Anyway, that should fix it:
$Index = 1
Get-ChildItem -Path "C:\mp3\*.mp3" |
	Where-Object {$_.BaseName -match '.* (?<Version>\d+\.\d+)\Z'} |
	Select-Object -Property FullName, Name, @{n='Version'; e={[version]($Matches['Version'])}} |
	Sort-Object -Property Version |
	ForEach-Object {
		Rename-Item -Path $_.FullName -NewName "$(($Index++).ToString('D3'))$($_.Extension)" -WhatIf
	}

Open in new window

It probably sees the part after . as file extension
ASKER CERTIFIED SOLUTION
Avatar of oBdA
oBdA

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
That looks better oBdA.

~bp