2016-06-19 7 views
0

私はrename.sh以下の名前を変更するスクリプトを持っています。スクリプト内で
./rename.sh 20151103
のように2015110320140306に置き換えられたときに日付引数を渡すことができるようにa variableを導入したいと思います。パラメータunixを使用して複数のファイル名を変更する

for f in *.CDR*; do 
    echo mv "$f" "${f/-20140306/-0-20140306}" 
done 

名前を変更するたびに手動でスクリプトを編集する必要はないので、これを自動化することを考えてください。他の方法は非常に歓迎されるでしょう。

+0

'TS = $ 1 'と' MVの "$ F" "$ TS" と間違っていますか? – GMichael

+0

@GMichaelそれは彼がやりたいことをしません。 – Kusalananda

答えて

0
#!/bin/bash 

pattern="$1" 

for f in *.CDR*; do 
    echo mv "$f" "${f/-${pattern}/-0-${pattern}}" 
done 

説明:

  • #! -lineは、私たちがbashスクリプトとしてこれを実行していると言います。

  • スクリプトは、コマンドラインで引数$1,$2などを引数として渡します。これらは、位置パラメータと呼ばれます(通常、$0にはスクリプトの名前が入ります)。

  • 私たちが置き換えたいパターンを含むべきであることがわかっているので、とし、それを変数$patternに割り当てます。はるかに複雑なスクリプトでは、コマンドラインスイッチ(getoptsがありますが、それは別の日の答えです)を扱う場所です。

  • 私たちは$1を引用しています。 (*のようなシェルグロブ文字が展開されていないことを確認するために、ユーザー入力を引用することをお勧めします)。

  • 残りの文字列は以前と同じですが、文字列20140306${pattern}で置き換えられています。私は可読性のためだけに$patternではなく${pattern}を使用しています。通常、"${a}nospaceafter"のような文字列を補間する場合は、$aではなく${a}を使用する必要があります。

そして、それはちょうどそれをテストする前にスクリプトを実行可能にすることの問題である必要があります。

$ chmod +x rename.sh 
+1

あなたはそれを完全に殺しました。おかげです。私はそれに座りましょう、私は質問するより多くの質問を持っていると確信しています。 – oak

+0

あなたが以前に提案したように、名前を変更したディレクトリを作成しました。そこには、名前を変更するファイルとスクリプトもあります。私は './rename.sh 20160611'でスクリプトを実行し、'/usr/bin/bash:悪いインタプリタ:いいえそのようなファイルやディレクトリ 'というメッセージを受け取りました。私は何かが足りないと思う。 – oak

+0

@oakこれは、スクリプトの最初の行( '#!...')がシステム上で 'bash'へのパスが間違っていることを意味します。 'which bash'コマンドを見て、その行を書き直してください。 – Kusalananda

0

これは、あなたが考えることができます方法の一つである:

#!/bin/bash 

input=$1 

for f in *.CDR*; do 
    echo mv "$f" "${f/-$input/-0-$input}" 
done 
関連する問題