У меня есть скрипт bash #!/usr/bin/env bash
, который называется частью процесса make. Этот сценарий создает каталог с файлами, относящимися к реализации, а затем tar
s их. Я хотел бы сделать копию каталога и переименовать некоторые файлы, заменив идентификатор версии словом «последняя». Это упростит сценарий получения последнего файла с веб-сервера. Когда я запускаю свой скрипт, кажется, что вызов rename
ничего не делает, почему?
#!/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
Я вызываю вышеприведенное с помощью ./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 ...
вместо простого переименования, но, похоже, это не имело заметного значения.