Perl名前変更ツール(Debian)で算術演算を実行しようとしています。

Perl名前変更ツール(Debian)で算術演算を実行しようとしています。

5つのmp3ファイルがあるとしましょう。

01-trackfoo.mp3
02-trackbar.mp3
03-trackbaz.mp3
04-trackabc.mp3
05-trackxyz.mp3

次に、ファイルをすばやく聞いて(コンソールのmplayerだけが必要です)、トラックがどこにあるかを確認します。無効な順序。 05は実際には02で、残りは名前を変更する必要があります。まず一時的な名前を変更します。

01-trackfoo.mp3

02-trackbar.mp3
03-trackbaz.mp3
04-trackabc.mp3
00-trackxyz.mp3

今、「変換」が必要です。 02は03になり、03は04になり、04は05になります。混乱を最小限に抑えるため、ex-05(現在00)は今後修正いたしますmv

私の方法は次のとおりです。 (perl rename、著者Larry Wall、Debianではデフォルト)

rename 's/0([2-4])([\s\S]+)/0($1+1)$2/' *

そして(後でより多くのRTFMを経た後)

rename 's/0([2-4])([\s\S]+)/0($1+1)$2/e' *

そのどれも機能しません。特に、/e[val]修飾子は他のものを許可しないので、さらにそうです。しかし、評価して評価を文字列と結合しようとすると、すぐにエラーが発生します。うまくいくかもしれませんbash、例えばと foo$((1+6))評価されますfoo7

それではどうすればよいですか(単一行が優先され、完全なスタンドアロンスクリプトを作成する予定はありません)。

答え1

あなたはほとんどそれを持っています。/e引用符とドット演算子を使用して変更された代替項目にリテラル文字列と文字列の関連付けを明示的に表示するだけです。

rename 's/0([2-4])([\s\S]+)/"0".($1+1).$2/e' *

答え2

これに完全なスタンドアロンスクリプトを書かずに、1行のスクリプトを好みます。

状況がこのように複雑になると、スクリプトを書かない理由はありません。ある実行から次の実行まで実行する方法を覚えていないため、毎回再作成するかスクリプトにラップします。

このような小さな問題の場合は、通常、Bashで解決しようとすることから始めます。

#!/bin/bash
if [ -z "$1" ] ; then echo Need arguments. ; exit 1 ; fi

typeset -i i=1
for f in "$*"
do
    tailbits=`echo "$f" | sed -e 's/^[0-9]+//'`
    mv "$f" sertmp-`printf %02d $i`"$tailbits"
    i=i+1
done

for f in "sertmp-*"
do
    mv "$f" `echo "$f" | sed -e s/^sertmp-//` 
done

デフォルトでは、スクリプトはすべての先行番号を削除し、前にゼロで埋められた増分シリアル番号を追加し、ファイルはスクリプトに渡された順序で番号が付けられます。

これは2段階で行われる。sertmp-最初のステップでは、名前の衝突の危険を避けるためにプレフィックスを使用します。このスクリプトを呼び出しmp3-renamerて次のように呼び出すと:

$ mp3-renamer 01-foo.mp3 03-bar.mp3 04-qux.mp3

名前変更に2つのパスを使用しないと、最初の名前変更でわずかな競合が発生します。 ( 01-foo.mp3-> 01-foo.mp3.)

しかし、次のように呼び出すと:

$ mp3-renamer 02-foo.mp3 01-foo.mp3

01-foo.mp3最初に名前を変更したときに誤って名前変更を削除しました。

問題がより複雑になったら、Perlで書き直しましょう。この時点で、ハッシュを使用して古い名前と新しい名前のマッピングを保存することができます.

関連情報