1

いくつかの変数を使用していくつかのファイルの名前を変更しようとしましたが、惨めに失敗しました。私はそれを機能させるためにさまざまな方法を試しましたが、役に立ちませんでした。私がドキュメントを理解している限り、これは物事を行う正しい方法ですが、今は困惑しています...

コードは次のとおりです(ファイルに書かれているrename_prefix.shとおり):

 #!/bin/sh
 NEWPREF="LALA"
 OLDPREF="LULU"
 for f in $OLDPREF*; do mv $f $(echo $f | sed 's/^$OLDPREF/$NEWPREF/g'); done

エラーメッセージは次のとおりです。

 usage: mv [-f | -i | -n] [-v] source target
   mv [-f | -i | -n] [-v] source ... directory

最初は、問題は正規表現であると仮定して変数を使用することにあると考えていましたが、エラー メッセージからわかるように、問題は変数が最初に宣言された場所にあります。

何が起きてる?

4

2 に答える 2

4

これは完全にシェルで行うことができ、sed 置換パターンのメタ文字をエスケープするという問題も回避できます。また、名前が変更されたファイルごとに 2 つのフォークが保存されるため、非常に高速です。

NEWPREF="LALA"
OLDPREF="LULU"
for f in "$OLDPREF"*; do
   mv "$f" "$NEWPREF${f#$OLDPREF}"
done

シェル変数の値から接尾辞と接頭辞を削除する方法について詳しく知りたい場合は、パラメーター展開に関する POSIX 仕様を読んでください(zsh、ksh、mksh、および bash のすべてがサポートしています)。

PS: のようなエラーが発生する唯一の方法は、.の前後にrename_prefix.sh: line 2: NEWPREF: command not found空白がある場合です。投稿されたプログラムは、実行したプログラムとまったく同じではないようです。カットアンドペーストではなく入力しましたか?NEWPREF=

于 2013-03-22T09:24:55.077 に答える
0

よし、POSIX を必要としないと仮定して、その他の特定の詳細について推測すると、一般的な修正が適用された同じことが次のようになります。

#!/bin/bash
newpref=LALA
oldpref=LULU

shopt -s nullglob

for f in "$oldperf"*; do
    mv -- "$f" "${f/#"$oldpref"/$newpref}"
done

またはPOSIX

#!/bin/sh
newpref=LALA
oldpref=LULU

for f in "$oldpref"*; do
    [ -e "$f" ] || break
    mv -- "$f" "${newpref}${f#"$oldpref"}"
done
于 2013-03-22T09:25:38.557 に答える