I have a number of tiff files named:


and I want to remove the .tif at the end of each of the files. How can I use the rename command to do this?

  • 2
    Bear in mind that NO linux or unix filesystem uses Windows or VMS-style "extensions" - it is only by convention that a suffix of the file name is ".tif" or ".c" or ".o" or ".so" or whatever. – Bruce Ediger Mar 19 '12 at 23:07
  • That's fine... I'm importing files from windows to linux :) – Paul Mar 19 '12 at 23:14
  • 1
    Technically speaking Windows doesn't use file extensions either, it's just that Windows 95's file manager kept using the last characters of the filename to determine file type after breaking out of the MS-DOS naming scheme and the convention has since remained. – RAKK Feb 20 '15 at 19:04

perl's rename (as typically found on Debian where it's also called prename), or this derivative (rename package on Debian):

rename 's/\.tif$//' *.tif

util-linux rename (as typically found on Red Hat, rename.ul on Debian):

rename -- .tif '' *.tif

(note that that one would rename blah.tiffany.tif to blahfany.tif)

  • 2
    I believe the "Debian" rename is by Larry Wall (comes with Perl?) and "Red Hat" one is from util-linux (rename.ul in Debian IIRC). – XTL Mar 20 '12 at 14:19
  • @XTL: True. I just call them that because they're the "rename" programs found in Debian or Red Hat derivatives. – Ignacio Vazquez-Abrams Mar 20 '12 at 14:39
  • Thanks so much! I never realized that there were different versions of 'rename'. I assume there are other subtle differences between the commands in debian & redhat. I'll have to lookup some of their differences. – Paul Mar 20 '12 at 14:45

For a non-rename, you might do:

$ for i in *.tif; do mv -i $i `basename $i .tif`; done

(-i to warn against replacing a file)

  • 12
    Safer faster version: for i in ./*.tif; do mv -i "$i" "${i%.tif}"; done – jw013 Mar 20 '12 at 14:13
rename -- .oldext .newext *.oldext

This substitutes the old extension with the new one. To simply remove the extension you can explicitly pass in an empty string as an argument.

rename -- .gz.tmp  '' *.gz.tmp

With the above command all files with .gz.tmp extension in the current folder will be renamed to filename.gz.

Refer to the article : Linux: remove file extensions for multiple files for details.

  • That assumes the util-linux implementation of rename which is incompatible with (and much more limited than) the traditional rename command from perl. – Stéphane Chazelas May 27 '15 at 9:49
  • Also note that it replaces the first occurrence of .oldext within the file name, not necessarily the extension (foo.oldextasy.oldext would be renamed to footasy.oldext). – Stéphane Chazelas May 27 '15 at 9:50

If you use IBM AIX you won't have a rename command, so in order to batch remove file extensions you'll have to use plain vanilla System V UNIX commands:

for file in *.tif; do
   mv $file `echo $file | sed 's/.tif$//'`;
  • You're missing closing `. – dwelle Jan 23 '16 at 15:20

can we make this recursive

for i in *.gz; do mv -i $i `basename $i .gz`; done

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.