如何从 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 *
我有一个 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 *