how to change the extension of multiple files using bash script?

bash, batch-rename

Solution

Explanation

- For recursivity you need Bash `>=4` and to enable `**` (i.e. `globstar`) ;

- First, I use parameter expansion to remove the string `.txt`, which must be anchored at the end of the filename (`%`) :

- the `#` anchors the pattern (plain word or glob) to the beginning,

- and the `%` anchors it to the end.

- Then I append the new extension `.xml`

- Be extra cautious with filename, you should always quote parameters expansion.

Code

This should do it in `Bash` (note that I only `echo`the old/new filename, to actually rename the files, use `mv` instead of `echo`) :

shopt -s globstar # enable ** globstar/recursivity
for i in **/*.txt; do
    [[ -d "$i" ]] && continue; # skip directories
    echo "$i" "${i/%.txt}.xml";
done

Problem

I am very new with linux usage maybe this is my first time so i hope some detailed help please. I have more than 500 files in multiple directories on my server (Linux) I want to change their extensions to .xml using bash script I used a lot of codes but none of them work some codes i used : ``` for file in *.txt do mv ${file} ${file/.txt}/.xml done ``` or ``` for file in *.* do mv ${file} ${file/.*}/.xml done ``` i do not know even if the second one is valid code or not i tried to change the txt extension beacuse the prompt said no such file '.txt' I hope some good help for that thank you

Original source