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

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

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 *
Другие вопросы по тегам