how can I rename multiple files by removing a character or string?

You can do this with a fairly small modification of either answer from the last question:

rename s/ras\.// sw.ras.*

or

for file in sw.ras.*; do
    mv "$file" "${file/ras./}"
done

Explanation:

rename is a perl script that takes a perl regular expression and a list of files, applies the regex to each file's name in turn, and renames each file to the result of applying the regex. In our case, ras is matched literally and \. matches a literal . (as . alone indicates any character other than a newline), and it replaces that with nothing.

The for loop takes all files that start with sw.ras. (standard shell glob) and loops over them. ${var/search/replace} searches $var for search and replaces the first occurrence with replace, so ${file/ras./} returns $file with the first ras. removed. The command thus renames the file to the same name minus ras.. Note that with this search and replace, . is taken literally, not as a special character.


Another option is to use mmv (Mass MoVe and rename):

mmv '*ras.*' '#1#2'

Don't forget to use the single quotes around your patterns, otherwise the stars will be expanded at the shell level.

The utility is not always available but if it's not, you can install it with:

sudo apt-get install mmv

See the man page here.


In any POSIX-compliant shell (bash, dash, ksh, etc):

for file in sw.ras.[[:digit:]][[:digit:]][[:digit:]]; do
    mv "${file}" "${file/ras\./}"
done

Or with rename:

rename 's/ras\.//' sw.ras.[[:digit:]][[:digit:]][[:digit:]]

Tags:

Rename