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 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.
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