Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Change file extensions of multiple files in a directory with terminal/bash?

I'm developing a simple launchdaemon that copies files from one directory to another. I've gotten the files to transfer over fine.

I just want the files in the directory to be .mp3's instead of .dat's

Some of the files look like this:

6546785.8786.dat
3678685.9834.dat
4658679.4375.dat

I want them to look like this:

6546785.8786.mp3
3678685.9834.mp3
4658679.4375.mp3

This is what I have at the end of the bash script to rename the file extensions.

cd $mp3_dir
mv *.dat *.mp3
exit 0

Problem is the file comes out as *.mp3 instead of 6546785.8786.mp3

and when another 6546785.8786.dat file is imported to $mp3_dir, the *.mp3 is overwritten with the new .mp3

I need to rename just the .dat file extensions to .mp3 and keep the filename.

Ideas? Suggestions?

like image 541
CokePokes Avatar asked Dec 18 '11 13:12

CokePokes


People also ask

Can you change multiple file extensions at once?

If you need to change the filename extension for multiple or all files in one folder, it would be troublesome and time-consuming to do that one by one. But don't worry. You can change file extension for multiple files in one folder at once simply with the command prompt. Here are the steps.

How do you change the extension of all files in a folder Linux?

Change File Extensions From the Terminal And if you want to change the extension (or the name), you'd use the mv command. mv stands for "move" and is the standard command on Linux for moving and renaming files.


2 Answers

Try:

for file in *.dat; do mv "$file" "${file%dat}mp3"; done

Or, if your shell has it:

rename .dat .mp3 *.dat

Now, why your command didn't work: first of all, it is more than certain that you only had one file in your directory when it was renamed to *.mp3, otherwise mv would have failed with *.mp3: not a directory.

And mv does NOT do any magic with file globs, it is the shell which expands globs. Which means, if you had this file in the directory:

t.dat

and you typed:

mv *.dat *.mp3

the shell would have expanded *.dat to t.dat. However, as nothing would match *.mp3, the shell would have left it as is, meaning the fully expanded command is:

mv t.dat *.mp3

Which will create a file named, literally, *.mp3.

If, on the other hand, you had several files named *.dat, as in:

t1.dat t2.dat

the command would have expanded to:

mv t1.dat t2.dat *.mp3

But this will fail: if there are more than two arguments to mv, it expects the last argument (ie, *.mp3) to be a directory.

like image 176
fge Avatar answered Oct 19 '22 09:10

fge


For anyone on a mac, this is quite easy if you have BREW, if you don't have brew then my advice is get it. then when installed just simply do this

$ brew install rename

then once rename is installed just type (in the directory where the files are)

$ rename -s dat mp3 *
like image 23
Matt Avatar answered Oct 19 '22 09:10

Matt