• friend_of_satan@lemmy.world
    link
    fedilink
    English
    arrow-up
    8
    ·
    edit-2
    2 months ago

    Check out rename

    $ touch foo{1..5}.txt
    $ rename -v 's/foo/bar/' foo*
    foo1.txt renamed as bar1.txt
    foo2.txt renamed as bar2.txt
    foo3.txt renamed as bar3.txt
    foo4.txt renamed as bar4.txt
    foo5.txt renamed as bar5.txt
    $ rename -v 's/\.txt/.text/' *.txt
    bar1.txt renamed as bar1.text
    bar2.txt renamed as bar2.text
    bar3.txt renamed as bar3.text
    bar4.txt renamed as bar4.text
    bar5.txt renamed as bar5.text
    $ rename -v 's/(.*)\.text/1234-$1.txt/' *.text
    bar1.text renamed as 1234-bar1.txt
    bar2.text renamed as 1234-bar2.txt
    bar3.text renamed as 1234-bar3.txt
    bar4.text renamed as 1234-bar4.txt
    bar5.text renamed as 1234-bar5.txt
    
    • electric_nan@lemmy.ml
      link
      fedilink
      arrow-up
      1
      ·
      2 months ago

      In your second example, it looks like you have an escape character before the first ‘dot’, but not the second one. Is this a typo, or am I misunderstanding the command?

      • friend_of_satan@lemmy.world
        link
        fedilink
        English
        arrow-up
        4
        ·
        edit-2
        2 months ago

        It’s not a typo. The first section of the regex is a matching section, where a dot means “match any character”, and an escaped dot is a literal dot character. The second section is the replacement section, and you don’t have to escape the dot there because that section isn’t matching anything. You can escape it though if it makes the code easier to read.

        rename is written in Perl so all Perl regular expression syntaxes are valid.

        However, your comment did make me realize that I hadn’t escaped a dot in the third example! So I fixed that.