Changing extension of multiple files in Ubuntu 12.04
Solution 1
You could cd
to the directory in question and execute something similar to this:
find -L . -type f -name "*.oldextension" -print0 | while IFS= read -r -d '' FNAME; do
mv -- "$FNAME" "${FNAME%.oldextension}.newextension"
done
Or if the files don't have any extension at all:
find -L . -type f -print0 | while IFS= read -r -d '' FNAME; do
mv -- "$FNAME" "${FNAME%}.newextension"
done
In your case you would have to replace newextension
with txt
.
Someone more proficient with bash might be able to break this down better. Please feel free to edit my answer in that case.
Original description:
1) It will rename just the file extension (due to use of
${FNAME%.so}.dylib
). All the other solutions using${X/.so/.dylib}
are incorrect as they wrongly rename the first occurrence of.so
in the filename (e.g.x.so.so
is renamed tox.dylib.so
, or worse,./libraries/libTemp.so-1.9.3/libTemp.so
is renamed to./libraries/libTemp.dylib-1.9.3/libTemp.so
- an error).2) It will handle spaces and any other special characters in filenames (except double quotes).
3) It will not change directories or other special files.
4) It will follow symbolic links into subdirectories and links to target files and rename the target file, not the link itself (the default behaviour of find is to process the symbolic link itself, not the file pointed to by the link).
Source:
Bash rename extension recursive - stackoverflow, answered by aps2012.
Solution 2
The rename
command is already installed, you don't need to add anything else.
rename
takes Perl code as its first argument. Most concrete use cases of renaming consist of a regexp replacement: s/REGEXP/REPLACEMENT/
. To remove the existing extension, replace everything starting at the last .
character.
rename 's/\.[^.]*$/.txt/' /path/to/directory/*
If your files have no extension (no .
in their name), you can either use $
(which matches the end of the file name) as the regexp, or append .txt
to the name.
rename '$_ = "$_.txt"' /path/to/directory/*
This doesn't change the content of the files, it only renames them. If your data isn't in the format you want, that's a completely unrelated problem.
Solution 3
I think you can use this simple bash script
rename_ext_script.sh
#!/bin/bash
for file in *
do
mv -- "${file}" "${file%.*}.txt"
done
this script works for both cases with extension or without
Solution 4
GUI solution
Overview
There is a really easy to use and powerful GUI tool in the Ubuntu Software Center to rename batches of files, pyRenamer.
Installation
sudo apt-get install pyrenamer
or
(source: ubuntu.com)
Screenshots
Related videos on Youtube
Andrew Martin
Updated on September 18, 2022Comments
-
Andrew Martin almost 2 years
As the title says, how can I change the extension of every file in a directory in Ubuntu? I've seen some examples use rename etc etc but I get an error (Unable to locate package rename) and it's not accessible through apt-get.
As an additional, I don't actually know the original file type! It's data that's been copied from the file system of Hadoop to the local drive and I need them all to be in .txt format.
If it makes a difference, I'm running Ubuntu 12.04 in Oracle Virtual Box
Edit: Output of: ls -l /usr/bin/rename /etc/alternatives/rename
amartin24@ubuntu-amartin24:~/TwitterMining/JSONTweets$ ls -l /usr/bin/*rename* /etc/alternatives/rename ls: cannot access /etc/alternatives/rename: No such file or directory -rwxr-xr-x 1 root root 10392 Mar 30 2012 /usr/bin/rename.ul
-
h3. almost 11 yearsThat's correct, but a lot more complex than it needs to be.
-
h3. almost 11 yearsYeech, that's horrible. Always put double quotes around command substitutions. Don't parse the output of ls. Your script needlessly mangles file names containing whitespace or globbing characters.
-
lexeek almost 11 yearsyou are right, but this one is for simple cases. once I faced with a similar problem
-
lexeek almost 11 yearschanged it for files with spaces
-
evilsoup almost 11 years@lexeek If you just quoted your variables, you wouldn't need to bother with $IFS...
-
h3. almost 11 yearsWhy so complicated? And this still doesn't handle file names containing wildcard characters. See my edit.
-
lexeek almost 11 yearsI am sorry but I am just a newby with unix and bash :)in consequence of this that I'm on the forum.
-
evilsoup almost 11 yearsIf you're a newbie, you should definitely read through the wiki Gilles linked to, it is one of the best bash resources on the web.
-
Glutanimate almost 11 yearsDidn't know about rename. This is definitely more elegant than my solution. +1
-
Glutanimate almost 11 yearsThanks for your answer. Could you walk us through on how you would use pyrename to change the extension of all files in a directory? I.e. what patterns would you use?
-
Andrew Martin almost 11 yearsI'd love to use this solution, but when I run it it says "rename: command not found". What am I doing wrong?
-
Andrew Martin almost 11 yearsThanks for this, but I should have specified that I can't use a GUI (accessing a remote VM without GUI available)
-
h3. almost 11 years@AndrewMartin That's really weird. Oh, that command is part of the
perl
package, which may no longer be installed by default on server installations. But even ifperl
isn't installed, you should have arename
command with a different syntax (that isn't as useful for this question) instead. -
Andrew Martin almost 11 yearsI tried installing perl, but apparently it's already installed. Do you have any other suggestions on how to get rename working?
-
h3. almost 11 years@AndrewMartin Something's wrong with your system. What does
ls -l /usr/bin/*rename* /etc/alternatives/rename
show? What abouttype rename perl
andecho $PATH
? -
Andrew Martin almost 11 yearsAs I couldn't get rename working, I went with this. A little longer, but works perfectly. Thanks for putting the time into answering this.
-
Andrew Martin almost 11 yearsThe first option shows /usr/bin/rename.u1
-
Andrew Martin almost 11 yearsThe "type rename perl" says -bash: type: rename: not found, then: perl is /usr/bin/perl
-
Andrew Martin almost 11 yearsFinally, echo $PATH just shows my path location, including the usr/bin folder
-
Andrew Martin almost 11 yearsNevermind, got it working. When I ran dpkg I saw that Perl location needed updating. I fixed that and then the command worked perfectly. Thanks so much!