1

ファイルを「aa -- bb.pdf」から「bb -- aa.pdf」に移動しようとしているとしましょう。

それを行う明白な方法は次のとおりです。

for f in *;
do 
mv $f $(echo "$f" | sed -E 's/(.\*) -- (.\*)(\..\*)/\2 -- \1\3/'); 
done

いくつかの引数の前後に一重引用符を追加する必要があります。さまざまな引数内にスペースがあり、正しく取得されないため、実際にはもう少し次のようになります。

for f in *; 
do 
    $(echo mv "'"$f"'" "'"$(echo "$f" | sed -E 's/(.\*) -- (.\*)(\..\*)/\2 -- \1\3/')"'");
done

しかし、私がこれを行う方法は、 mv: usage:mv [-f | -i | -n] [-v] source target などの標準的な使用法のリサイタルだけです。

これを画面に出力すると、見栄えがよくなります。

mv 'aa -- bb.pdf' 'bb -- aa.pdf'

しかし、これでどのようなバリエーションを試しても、使用法を列挙しているだけで (おそらく、構文に問題があることを伝えている)、その理由がわかりません。

何か案は?

4

1 に答える 1

1

以下は bash の実装です。

re="(.+) -- (.+)([.].+)"
for f in *; do
    if [[ $f =~ $re ]]; then 
        newf="${BASH_REMATCH[2]} -- ${BASH_REMATCH[1]}${BASH_REMATCH[3]}"
        mv -- "$f" "$newf"
    fi
done

あなたのエラーの理由は、おそらく「オプションの終わり」--を伝えるものです。ファイル名の前にmv追加を追加すると、問題が解決するはずです。--

于 2012-11-28T05:47:46.043 に答える