2016-03-21 19 views
0

私は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

この文字列:あなたは、単一引用符の間にそれを置くため

replacment="'s/${DATE_NOW}/latest/'" 

はまったく同じに保たれます。

は、あなたが試してみました:

replacment="s/${DATE_NOW}/latest/" 

をこの1つはperlのなしで、私のUbuntuで働いていた:

$ ./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 * 
+0

を私がしようとしたことを確信していました私は最後の1時間に行った多くの並べ替えの上にそれが失敗した。私はちょうど今試して、それは動作します!わたしが物事から始まった些細な 'rename -v" s/$ {DATE_NOW}/latest/"*"に戻っても、今はOKと思われます。解決していただきありがとうございます。私は過去2時間何をしているのか分かりません。 – TafT

+0

うれしい私は助けることができました! – zezollo

関連する問題