printfで名前変更コマンドを使用する方法

printfで名前変更コマンドを使用する方法

テレビシリーズのエピソードの数を修正しようとしたときに rename 関数を試してみましたが、printf の戻り値を rename パラメータとして渡そうとしましたが、失敗しました。ほぼすべての組み合わせを試してみましたが、

for j in $(seq 1 9);
do 
    rename 's/"$( - "`printf "%d" ${j}`" - )"/"$( - "`printf "0%d" ${j}`" - )"/g' *
done

私は考えることができますが、何も動作しないようです。この場合、1-9にのみ興味があるので、最終的に手動で行うようになりました。

rename 's/- 1 -/- 01 -/g' *
rename 's/- 2 -/- 02 -/g' *
...

上記が後で参照できない理由を誰かが指摘できますか?

ベストアンサー1

式全体を一重引用符で引用するため、シェル補間は発生しません。 Perl は"$( - "printf "%d" ${j} 最も奇妙な正規表現を表示します。" - )"これは Perl によって次のように補間されます。

% perl -E 'say qq{"$( - "`printf "%d" ${j}`" - )"}'
"42 640 - "`printf "%d" `" - )"
% 

$(Perlに変数の挿入を要求したので、変数を読み取ることができますperldoc -v '$('。この正規表現はファイルと一致しない可能性があります。 (そして、非常に複雑な文字列に複数の言語を挿入しようとしたときに発生するいくつかのトラップの1つを示します。Perlがすべてを行うことができるので、実際には必要ありません。)

より良いアプローチは、関心のある項目を一致させ調整することです。ファイル名に数字が1つしかないと仮定すると、ハイフンで囲まれた数字のようです。逆参照を保存し([0-9]+)て使用してください。Perlsprintf関数/eこの数字を適切に入力します(右側を式として処理して実際に呼び出すための重要なフラグも追加sprintf)。

% touch "blah - "{1..9}" - blah"
% ls
blah - 1 - blah blah - 3 - blah blah - 5 - blah blah - 7 - blah blah - 9 - blah
blah - 2 - blah blah - 4 - blah blah - 6 - blah blah - 8 - blah
% rename 's/([0-9]+)/sprintf "%02d", $1/e' *
% ls
blah - 01 - blah    blah - 04 - blah    blah - 07 - blah
blah - 02 - blah    blah - 05 - blah    blah - 08 - blah
blah - 03 - blah    blah - 06 - blah    blah - 09 - blah
% 

ファイル名に他の場所に数字がある場合は、正規表現を使用してこれを説明してください。おそらく次のようになります。

% rename 's/- ([0-9]+) -/sprintf "- %d -", $1/e' *
% ls
blah - 1 - blah blah - 3 - blah blah - 5 - blah blah - 7 - blah blah - 9 - blah
blah - 2 - blah blah - 4 - blah blah - 6 - blah blah - 8 - blah
% 

rename正規表現を最も効果的に使用するには、次を参照してください。

おすすめ記事