Search code examples
bashfile-renamemv

Move last part of a file name to the begin


I would like to modify the name of several files in a folder. The name are in this format:

Name_name_name_name_XXXX.fa

I would like:

XXXX_Name_name_name_name.fa

I tired using

for f in *.fa; do mv "${f/.fa/Name_name_name_name.fa}";done

output Name_name_name_name_XXXX_Name_name_name_name.fa

and then

for f in *.fa; do mv "${f/Name_name_name_name_//}"; done

to remove the 4 name_name. but it didnt work.

Any idea how to do it?


Solution

  • You can use sed:

    for f in *.fa; do
       mv "$f" $(sed -E 's/^(.+)_([^.]+)\./\2_\1./' <<< "$f")
    done
    

    sed command uses 2 capture groups. 1st group contains string before last underscore and 2nd group contains XXXX part (part between last _` and dot).