1

Command below is from this answer: https://stackoverflow.com/a/208220/3470343

The command adds the word new. as a prefix. That's understood.

rename 's/(.*)$/new.$1/' original.filename

However, I'd like to ask why the open and close brackets are required here:

(.*)

And also why is $1 the variable which stores the original file name, why can't I do the the same with following (where i have replaced $1 with $2):

rename 's/(.*)$/new.$2/' original.filename

I'm still relatively new to bash, so help would be greatly appreciated.

Community
  • 1
  • 1
olfek
  • 3,210
  • 4
  • 33
  • 49

1 Answers1

4

First off, (.*)$ is what is known as a regular expression (or regex). Regular expressions are used to match text based on some rules.

For example, .* matches zero or more characters. $ matches the end of the line. Because regular expressions by default are greedy, .*$ matches the whole line (although, precisely because regexes are greedy, $ is superfluous).

However, I'd like to ask why the open and close brackets are required here: (.*)

The round brackets denote a group. Groups are used to "save" the contents of the matched text, so that you can use it later.

And also why is $1 the variable which stores the original file name, why can't I do the the same with following (where I have replaced $1 with $2): ...

In the case of rename(1), the first group is stored in $1, the second group is stored in $2 and so on. For example, the following regular expression:

(a)(b)(c)

stores a single a into $1, a single b into $2 and so on.

There you have only one group, therefore you must use $1. Tokens like $2, $3, ... will be empty.

Last but not least, you could use a shorter, equivalent command:

 rename 's/^/new./'

Here ^ denotes the start of the string.

Andrea Corbellini
  • 17,339
  • 3
  • 53
  • 69