如何从 Ubuntu 上的 bash 脚本成功调用重命名?

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

我有一个 bash 脚本 #!/usr/bin/env bash,它被称为制作过程的一部分。此脚本创建一个目录,其中包含与实现相关的文件,然后 tar 将它们上传。我想复制目录并重命名一些文件以用 "latest" 一词替换版本标识符。这将使编写从网络服务器获取最新文件的脚本变得简单。当我 运行 我的脚本时,对 rename 的调用似乎什么都不做,这是为什么?

#!/usr/bin/env bash

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

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

我用 ./rename.sh product-id 调用上面的代码,并从 ls 获得预期的输出,表明当前工作目录是我想要重命名的文件所在的目录。

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

我希望看到的是一些重命名的文件。当我直接从终端仿真器调用重命名函数时,我看到重命名发生了。

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

我尝试了一些转义字符串的变体,使用 ` 或 $(),从命令行中删除所有替换。到目前为止,没有任何效果,所以我一定遗漏了一些基本的东西。

我读到 #!/usr/bin/env bash 的行为与 #!/bin/bash 非常相似,所以我认为这无关紧要。我知道 Ubuntu 和 Debian 对某些其他发行版有不同版本的重命名脚本,我 运行 正在 Ubuntu 上。这导致我尝试调用 perl /usr/bin/rename ... 而不是仅仅重命名,但这似乎没有明显的区别。

这个字符串:

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

将保持完全相同,因为您将其放在单引号之间。

您尝试过:

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

这个在我的 Ubuntu 上工作,没有 perl:

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

test_script内容为:

#!/bin/bash

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

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

rename -v $replacment *