The most common way to change file extensions recursively in a directory is to use a bash for loop. We can prompt the user to enter the target directory, old extension, and the new extension to rename using a bash script.
Alternative command without an explicit loop (man find
):
find . -type f -exec mv '{}' '{}'.jpg \;
Explanation: this recursively finds all files (-type f
) starting from the current directory (.
) and applies the move command (mv
) to each of them. Note also the quotes around {}
, so that filenames with spaces (and even newlines...) are properly handled.
this will find files without extension and add your .jpg
find /path -type f -not -name "*.*" -exec mv "{}" "{}".jpg \;
This is a little late, but I thought I would add that a better solution (although maybe less readable) than the ones so far might be:
find /path -type f -not -name "*.*" -print0 | xargs -0 rename 's/(.)$/$1.jpg/'
Using the find | xargs
pattern generally results in more efficient execution, as you don't have to fork a new process for each file.
Note that this requires the version of rename found in Debian-flavored distros (aka prename), rather than the traditional rename. It's just a tiny perl script, though, so it would be easy enough to use the command above on any system.
like this,
for f in $(find . -type f); do mv $f ${f}.jpg; done
I am not expecting you have space separated file names,
If you do, the names will need to be processed a bit.
If you want to execute the command from some other directory,
you can replace the find .
with find /target/directory
.
For renaming all files with no extension in Windows basic you can do ren * *.jpg
Since the file as no extension, just use the *, or if you want to change png to jpg
use ren *.png *.jpg
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With