2

I have a folder with the bulk of files in it of different types, i.e .pdf,.jpg,.png,.tiff etc., but all are named with the extension .JPG. How can I rename all of them with their original extensions? i.e pdf to pdf, tiff to tiff and so on.

I can find the file type by:

file 99.jpg 99.jpg: PDF document, version 1.3 

Is there any script or program with which I can do this?

2 Answers 2

3

You can use the MIME type found by file:

#! /usr/bin/env bash for f in ./*.JPG; do type=$(file -bi "$f") type=${type%%;*} base=${f%.*} final= case "$type" in application/pdf) final="$base".pdf ;; image/png) final="$base".png ;; image/tiff) final="$base".tiff ;; esac if [ "$final" ]; then printf '%s --> %s\n' "$f" "$final" # mv -f "$f" "$final" fi done 

Add more types to the case if you need to (but leave out image/jpeg, since JPEG files already have the right extension). Review the changes, then uncomment the mv line when you're happy with the results.

4
  • You reverted my changes but your script will fail when files are named like -filename. The -- will take care of that. Commented Jun 1, 2017 at 15:31
  • 1
    @val0x00ff Nope, I reverted that part of your script because it isn't needed. Because of ./*.JPG, file and mv will see ./-filename, not -filename. Please pay attention before "fixing" other people's posts. Commented Jun 1, 2017 at 16:20
  • You know it's worthless to discuss this since my comment probably didn't arrive on time. Your original post didn't include the ./ and that's why I suggested the -- (End of options) syntax. Commented Jun 6, 2017 at 7:24
  • @val0x00ff My edit was posted 6 minutes after the initial revision (what can I say, I'm an old fart). Your comment was posted almost 8 hours later, and it was about me reverting your changes, not about my initial revision. The reverted version was (and still is) 100% correct. Commented Jun 6, 2017 at 7:36
2
  1. Generate the commands without running them.

    Use mimetype to generate a list of command strings, which is thereafter tweaked by GNU sed's substitute s command:

    cd ~/messed/up/folder/ # go where the files are... mimetype -M --output-format 'mv "%f" "%f%m"' *.JPG | sed 's#\.[^./"]*/\([^./]*"\)$#\.\1#' 
  2. If some of the file extensions look a little too mime-ish, (i.e. .jpeg instead of .jpg, etc.), then add as many s commands as needed between sed ' and s, for example:

    sed 's/jpeg"$/jpg"/;s#\.[^./"]*/\([^./]*"\)$#\.\1#' 
  3. Once the output looks good, run that with the GNU sed's evaluate e option. (Just put an e before the final '.) So the whole thing might look like:

    cd ~/messed/up/folder/ # go where the files are... mimetype -M --output-format 'mv "%f" "%f%m"' *.JPG | sed 's/jpeg"$/jpg"/;s#\.[^./"]*/\([^./]*"\)$#\.\1#e' ls # show results 

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.