EDIT 2: After learning that aliases aren’t really suited for regex, and trying the script, I thought maybe reloading the .bashrc file wasn’t enough to refresh the aliases, so I closed my terminal and after reopening the terminal and trying the script again it works just fine.

Okay, I’ve tried searching for help on this and I can’t find anything, and I’m banging my head on my desk trying to figure out how to get this to work.

I routinely have to capitalize the first letter in a series of files that are passed to me. So I’ll get:

file01
file02

And so on. I use perl rename (I’m using Fedora) with the following command and regex, and from within the directory it works as expected:

prename 's/(^[a-z]?)/\U$1/' *

I do this a lot. At least once a day, which calls for an alias or script.

I tried adding it as an alias to my .bash_aliases like so:

alias cap="prename 's/(^[a-z]?)/\U$1/' *"

And when I do, instead of capitalizing the first letter of the filenames it removes them. Searching got me nothing, in part because I probably am not asking the right question.

So then thought I’d write a dead simple bash script named cap (after removing the alias and reloading .bashrc)

#! /bin/bash

prename 's/(^[a-z]?)/\U$1/' *

And when I use cap in the directory, the script also cuts off the first letter instead of capitalizing it.

I suspect it’s the $1 variable in the regex that’s causing the problem, but I can’t figure out how to address it so it works correctly in the alias or the script.

EDIT: I just tried some more searching and found that regex won’t work in aliases, so it explains that, but I still can’t figure out how to get it to work in the script.

  • _edge
    link
    fedilink
    arrow-up
    2
    ·
    2 days ago

    Your problem is most likely escaping. $1 has a meaning in regex and in shell. You want the former and the single quotes achieve this.

    In your second example, with alias, probably the shell interpreting this replaces $1 with whatever the first arg in the shell environment is, probably the empty string.

    Not sure what the problem with the shell script is. Anyway try escaping the $ as $ and \ as \.

    You can see where you are wrong if you replace prename with echo for debugging. Or in a shell script do

    set -ex