Search code examples
bashshellunixrenamewildcard-expansion

How to remove a common prefix pattern from multiple file names in bash


I would need to rename thousands of files, right now I'm doing it with removing first x characters, but it can be a lengthy process since the number of chars needed to be removed changes.

Source files are named like this:

4023 - 23 - Animal, crocodile 4 legs.txt 
243 - 4 - Animal, dog 4 legs.txt 
5450 - 2 - Animal, bird 2 legs.txt

Renamed:

Animal, crocodile 4 legs.txt
Animal, dog 4 legs.txt
Animal, bird 2 legs.txt

It seems the easiest it would be to trim everything before "A" appears, but I do not know how to do this. Something with a loop that could be used as a bash script would be awesome.


Solution

  • You can use bash parameter expansion

    ${VAR#*-*- }

    to remove a prefix by pattern. That's using the text in the shell variable VAR and generating a string based on removing a prefix that matches the wildcard pattern *-*- - e.g. any characters then a dash then any characters and then a second dash and a space

    In order to get the filenames in a loop you can just use a bash for with a pattern

    for VAR in *.txt; do mv "$VAR" "${VAR#*-*- }"; done
    

    the quoting is necessary in the mv to prevent the whitespace in the filenames being split up into multiple arguments by the shell