私はmakeプロセスの一部と呼ばれるbashスクリプト#!/usr/bin/env bash
を持っています。このスクリプトは、実現に関連するファイルを含むディレクトリを作成し、次にtar
を作成します。私は、ディレクトリのコピーを取って、いくつかのファイルの名前を "latest"という単語で置き換えることを望みます。これにより、Webサーバーから最新のファイルを取得するスクリプトを簡単に作成できます。スクリプトを実行すると、rename
への呼び出しは何もしないように見えますが、それはなぜですか?Ubuntuのbashスクリプトから名前を正しく変更する方法を教えてください。
#!/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
で上記を呼び出し、現在の作業ディレクトリは、私が名前を変更したいファイルの完全な1であることを示し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 ...
私は、文字列をエスケープ `または$()を使用して、コマンドラインからすべての置換を削除するには、いくつかのバリエーションを試してみました。これまでのところ何も機能していないので、何か根本的なものが欠けているはずです
私はそれが#!/bin/bash
のように振る舞うので、それは遊んでいるとは思いません。私は、UbuntuとDebianがいくつかの他のディストリビューションとは異なる名前のリネームスクリプトを持っていることを知っています。私はUbuntuで動いています。それはちょうど名前を変更するのではなくperl /usr/bin/rename ...
と呼ぶように私を導くが、それは知覚できる違いをもたらさなかったようだ。
を私がしようとしたことを確信していました私は最後の1時間に行った多くの並べ替えの上にそれが失敗した。私はちょうど今試して、それは動作します!わたしが物事から始まった些細な 'rename -v" s/$ {DATE_NOW}/latest/"*"に戻っても、今はOKと思われます。解決していただきありがとうございます。私は過去2時間何をしているのか分かりません。 – TafT
うれしい私は助けることができました! – zezollo