TafT
TafT

Reputation: 3095

How do I call rename successfully from a bash script on Ubuntu?

I have a bash script #!/usr/bin/env bash that is called part of a make process. This script creates a directory with the files pertinent to a realise and then tars them up. I would like to take a copy of the directory and rename some of the files to replace the version identifier with the word "latest". This will make it simple to script the acquisition of the latest file from a web-server. When I run my script, the call to rename seems to do nothing, why is that?

#!/usr/bin/env bash

DATE_NOW="$(date +'%Y%m%d')"
product_id_base="$1"

firmware_dir="${product_id_base}-full-${DATE_NOW}"

# ...rest of file ommitted to protest the innocent
# It creates and fills the ${firmware_dir} with some files that end in 
# -$DATE_NOW.<extention> and I would like to rename the copies of them so that they end in
# -latest.<extention>
cp -a "./${firmware_dir}" "./${product_id_base}-full-latest"

# see what there is in pwd
cd "./${product_id_base}-full-latest"
list_output=`ls`
echo $list_output
# Things go OK until this point. 

replacment="'s/${DATE_NOW}/latest/'"
rename_path=$(which rename)
echo $replacment
perl $rename_path -v $replacment *
echo $cmd
pwd

$cmd

echo "'s/-${DATE_NOW}/-latest/g'" "${product_id_base}-*"
echo $a

# check what has happened
list_output=`ls`
echo $list_output

I call the above with ./rename.sh product-id and get the expected output from ls that indicates the present working directory is the one full of files that I want renamed.

$ ./rename.sh product-id ET-PIC-v1.1.dat ET-PIC-v1.1.hex
product-id-20160321.bin product-id-20160321.dat
product-id-20160321.elf product-id-20160321.gz 's/20160321/latest/'

/home/thomasthorne/work/product-id/build/product-id-full-latest
's/-20160321/-latest/g' product-id-*

ET-PIC-v1.1.dat ET-PIC-v1.1.hex product-id-20160321.bin
product-id-20160321.dat product-id-20160321.elf product-id-20160321.gz

What I hopped to see was some renamed files. When I directly call the rename function from a terminal emulator I see the rename occur.

~/work/product-id/build/product-id-full-latest$ rename -vn
's/-20160321/-latest/g' * product-id-20160321.bin renamed as
product-id-latest.bin product-id-20160321.dat renamed as
product-id-latest.dat product-id-20160321.elf renamed as
product-id-latest.elf ...

I have tried a few variations on escaping the strings, using ` or $(), removing all the substitutions from the command line. So far nothing has worked so I must be missing something fundamental.

I have read that #!/usr/bin/env bash behaves much like #!/bin/bash so I don't think that is at play. I know that Ubuntu and Debian have different versions of the rename script to some other distributions and I am running on Ubuntu. That lead me to try calling perl /usr/bin/rename ... instead of just rename but that seems to have made no perceivable difference.

Upvotes: 0

Views: 87

Answers (1)

zezollo
zezollo

Reputation: 5017

This string:

replacment="'s/${DATE_NOW}/latest/'"

will be kept exactly the same because you put it between single quotes.

Have you tried with:

replacment="s/${DATE_NOW}/latest/"

This one worked on my Ubuntu, without perl:

$ ./test_script
filename_20160321 renamed as filename_latest
filename2_20160321 renamed as filename2_latest
filename3_20160321 renamed as filename3_latest

test_script content being:

#!/bin/bash

DATE_NOW="$(date +'%Y%m%d')"

replacment="s/${DATE_NOW}/latest/"

rename -v $replacment *

Upvotes: 1

Related Questions