Как мне успешно вызвать переименование из сценария bash в Ubuntu?

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


person TafT    schedule 21.03.2016    source источник


Ответы (1)


Эта строка:

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 *
person zezollo    schedule 21.03.2016
comment
Я был уверен, что пробовал это во время одной из многих перестановок, которые я сделал за последний час, но это не удалось. Я попробовал это только сейчас, и это работает! Даже когда я возвращаюсь к тривиальному rename -v "s/${DATE_NOW}/latest/" *, с которого я начал, все теперь кажется нормальным. Спасибо за решение. Я не знаю, что я делал последние 2 часа. - person TafT; 21.03.2016
comment
Рад, что смог помочь! - person zezollo; 21.03.2016