Deprecated: Using ${var} in strings is deprecated, use {$var} instead in /home/vol9_8/epizy.com/epiz_21441008/htdocs/wp-content/plugins/wp-optimize/includes/class-updraft-smush-manager.php on line 1215

Deprecated: Creation of dynamic property WPO_Page_Cache::$rules is deprecated in /home/vol9_8/epizy.com/epiz_21441008/htdocs/wp-content/plugins/wp-optimize/cache/class-wpo-page-cache.php on line 99

Deprecated: Creation of dynamic property WP_Optimize_Minify::$minify_commands is deprecated in /home/vol9_8/epizy.com/epiz_21441008/htdocs/wp-content/plugins/wp-optimize/minify/class-wp-optimize-minify.php on line 16

Deprecated: Creation of dynamic property WP_Optimize_Minify::$enabled is deprecated in /home/vol9_8/epizy.com/epiz_21441008/htdocs/wp-content/plugins/wp-optimize/minify/class-wp-optimize-minify.php on line 22

Notice: Function register_block_script_handle was called incorrectly. The asset file for the "editorScript" defined in "contact-form-7/contact-form-selector" block definition is missing. Please see Debugging in WordPress for more information. (This message was added in version 5.5.0.) in /home/vol9_8/epizy.com/epiz_21441008/htdocs/wp-includes/functions.php on line 5827

Deprecated: Return type of Requests_Cookie_Jar::offsetExists($key) should either be compatible with ArrayAccess::offsetExists(mixed $offset): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/vol9_8/epizy.com/epiz_21441008/htdocs/wp-includes/Requests/Cookie/Jar.php on line 63

Deprecated: Return type of Requests_Cookie_Jar::offsetGet($key) should either be compatible with ArrayAccess::offsetGet(mixed $offset): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/vol9_8/epizy.com/epiz_21441008/htdocs/wp-includes/Requests/Cookie/Jar.php on line 73

Deprecated: Return type of Requests_Cookie_Jar::offsetSet($key, $value) should either be compatible with ArrayAccess::offsetSet(mixed $offset, mixed $value): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/vol9_8/epizy.com/epiz_21441008/htdocs/wp-includes/Requests/Cookie/Jar.php on line 89

Deprecated: Return type of Requests_Cookie_Jar::offsetUnset($key) should either be compatible with ArrayAccess::offsetUnset(mixed $offset): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/vol9_8/epizy.com/epiz_21441008/htdocs/wp-includes/Requests/Cookie/Jar.php on line 102

Deprecated: Return type of Requests_Cookie_Jar::getIterator() should either be compatible with IteratorAggregate::getIterator(): Traversable, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/vol9_8/epizy.com/epiz_21441008/htdocs/wp-includes/Requests/Cookie/Jar.php on line 111

Deprecated: Return type of Requests_Utility_CaseInsensitiveDictionary::offsetExists($key) should either be compatible with ArrayAccess::offsetExists(mixed $offset): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/vol9_8/epizy.com/epiz_21441008/htdocs/wp-includes/Requests/Utility/CaseInsensitiveDictionary.php on line 40

Deprecated: Return type of Requests_Utility_CaseInsensitiveDictionary::offsetGet($key) should either be compatible with ArrayAccess::offsetGet(mixed $offset): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/vol9_8/epizy.com/epiz_21441008/htdocs/wp-includes/Requests/Utility/CaseInsensitiveDictionary.php on line 51

Deprecated: Return type of Requests_Utility_CaseInsensitiveDictionary::offsetSet($key, $value) should either be compatible with ArrayAccess::offsetSet(mixed $offset, mixed $value): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/vol9_8/epizy.com/epiz_21441008/htdocs/wp-includes/Requests/Utility/CaseInsensitiveDictionary.php on line 68

Deprecated: Return type of Requests_Utility_CaseInsensitiveDictionary::offsetUnset($key) should either be compatible with ArrayAccess::offsetUnset(mixed $offset): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/vol9_8/epizy.com/epiz_21441008/htdocs/wp-includes/Requests/Utility/CaseInsensitiveDictionary.php on line 82

Deprecated: Return type of Requests_Utility_CaseInsensitiveDictionary::getIterator() should either be compatible with IteratorAggregate::getIterator(): Traversable, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /home/vol9_8/epizy.com/epiz_21441008/htdocs/wp-includes/Requests/Utility/CaseInsensitiveDictionary.php on line 91
A Full Circle – Back To DOS for Renaming Files – Rajib's Blog Rajib's Blog

A Full Circle – Back To DOS for Renaming Files

A fairly common problem I face, are files that do not have a useful file-name. It’s quite common with MP3 and AVI files downloaded from not so great sources. Since many of these files are local to India, information about them is not easily available in resources such as freedb, amazon, imdb etc. Hence none of the automatic renaming solutions work.

If the file-names are however available on the web, it is a fairly simple matter to rename these nondescript files on your HDD. Just try:

for /f "tokens=1,2 delims=," %i in (fnames.txt) do ren %i.ext "%j.ext"

Mystified? Let me work backwards and explain it.

Your Wish Is My Command

What you see above is a Command Line operation. You need to type the above command in a Windows Command Prompt window and press Enter to execute it. Make sure you are performing this operation in the folder where your files are located.

For ex: if my MP3 files are located in My Music\SomeSongs folder, I will have to launch command prompt and then issue the following command to change the current working directory:

cd C:\Users\owner\Music\SomeSongs

The FOR command in Windows is a very versatile command that allows you to perform actions when GUI solutions for renaming files such as EasyTAG, Tag&Rename, MediaMonkey etc. have failed.

The /F command extension allows you to parse a file and use it’s output to modify the FOR action. The file from which input data wil be read is mentioned between ( ) brackets. In my case, it’s a text file called fnames.txt.

The text file is my database. In the text file, I have mentioned the current file-names and proposed file-names. The data is separated by comma.

If you opened my file in Notepad, it would look like:

T-001,Mukesh - Noori
T-002,Kishore Kumar - Barah Anna
...
...

You have probably figured out by now that I have a directory full of files called T-001.mp3, T-002.mp3 … T-101.mp3 and I want them renamed.

How did I create the fnames.txt file?

Step 1:

I visited the webpage where track information was present in a list (correctly ordered). I copied this information into Notepad. I cleaned up the notepad window so that all that was present was just the file-names. No other information such as Ads, Previous Page/Next Page links, extraneous spaces etc. I saved this file as webnames.txt

I also created a file called dirlist.txt that contained the names of the files in the folder. For this, use the command

dir /b /on>dirlist.txt

Actually in my case, I typed:

dir *.mp3 /b /on>dirlist.txt

What the command did was to only show the list of files with MP3 extension, just the Bare (/b) file-name (no filesize, date info) and sorted by in ascending order by name (/on). Instead of showing this list on the screen, it saved it to a file called dirlist.txt (>dirlist.txt) in the current working directory.

So I have two files – one containing the current file-names (dirlist.txt) and the other containing the proposed file-names (webnames.txt). I need to place this information side by side, separated by a comma.

Excel At Complicating Things

For this, I started Microsoft Excel. First I selected all the lines in the dirlist.txt file, copied them to the clipboard and pasted them into Column A of Excel. Then I copied all the lines from webnames.txt file and pasted them in Column B of Excel.

Excel figures out that you are pasting lines that are separated by newline character. As a result, it pastes each individual line in a row of it’s own, thus creating a record (row) with two fields (columns).

So now I have an Excel file with two fields. The fields contain side-by-side information that shows the current file-name and proposed file-name. I saved this file in Excel in the Comma Separated Value (CSV) and called it fname.txt. Now I have a database in plain-text format.

Note: Since I am using a command to separate the fields, I make sure that the file-names themselves do not contain a comma -or- all hell will break lose. You could put the planet and it’s inhabitants at risk!

Back to the FOR command

for /f “tokens=1,2 delims=,” %i in (fnames.txt) do ren %i.ext “%j.ext”

If you look at the command line, you will notice that I have mentioned my database file (fnames.txt), the delimeter as comma (delims=,). Using the tokens parameter, I have specified that I need the information from the database that is contained in Field 1 (current file-name) and Field 2 (proposed file-name).

The %i parameter asks the FOR command to create a variable called %i. Information from Field 1 of the database is placed in this variable. Since I am actually reading two fields, FOR command automatically creates another variable %j to hold information from Field 2.

The DO parameter of FOR command contains the action that FOR command will execute repeatedly. In my case, it’s a simple file rename operation. Rename a file called %i.mp3 to %j.mp3

During execution, %i and %j are replaced with data and you will see the command being executed is:

ren T-001.mp3 "Mukesh - Noori.mp3"

You will note that I have replaced .ext with MP3 since that is the extension of my files. Also note the double-quotes around “%j.ext”. This ensures that in case your proposed file-name contains spaces, the REN command treats it as a single file-name and not as other non-existent files.

Congratulations to me! I have spent an hour researching and figuring this out to rename 100 files when I could have just renamed them manually using copy-paste from the Browser into Windows Explorer in about the same time!

But then again, the goal was to rename 100 files in 2 minutes from next time on; 2 minutes is what it will take next time on!

Further Actions

The file-naming saga did not begin at this step, neither it ended at this step. For ex: My files were not called originally T-001.mp3, T-002.mp3 … They had pretty weird names. All that was correct was the track number. I used a MP3 Renamer to rename the file according to track number.

Once the renaming is successful, the files may now have meaningful names but the ID3 info still contains crap. Again, I used the MP3 renamer to derive Artist – Song information from the file-name and save the ID3 tag.

I might use this technique to rename .avi files (TV Series), .kar files (Karaoke collections) etc.

A reason why I even bothered to go to the command prompt was because the GUI tools did not work for me. Tools such as Tag&Rename, MediaMonkey do not support renaming files from Text files. OpenSource project EasyTag does – but for some reason, on my Win7 computer it just refused to work well. It kept crashing.

Command prompt to the rescue after all. Indeed, a classical return to home in a full circle.

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.