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:]]