web-dev-qa-db-ja.com

パターン一致後にファイルの名前を変更するzmvコマンド

zmvを使用して this 質問の解決策を見つけようとしていました。 zmvを使用して正確な解決策を見つけることができません。これは私がこれまでに思いついたものです。

ここ から、コマンドを使用して、1.jpg2.jpg34.jpgなどのすべてのファイルの名前を001.jpg002.jpg034.jpgに変更できます。

zmv '(<1->).jpg' '${(l:3::0:)1}.jpg'

ここで、ファイルの名前を変更できるように、最初にいくつかのパターンを持つようにzmvを変更する必要があります。しかし、私はこれを達成することができません。私が見つけた最も近いものはこれです solution

c=1 base='0-' zmv '*.jpg' '${base}${(l:3::0:)$((c++))}.jpg'

ただし、上記のアプローチの問題は、ファイルが0-1.jpg0-44.jpgの場合、上記のコマンドで0-001.jpgおよび0-002.jpgではなく0-001.jpgおよび0-044.jpgに置き換えられることです。

必要に応じて名前を変更するには、zmvコマンドをどのように変更する必要がありますか?

3
Ramesh

-l拡張フラグ を使用できます:

l:expr :: string1 :: string2:

結果の単語を左側に埋め込みます。各単語は必要に応じて切り捨てられ、expr文字幅のフィールドに配置されます。

引数:string1:および:string2:はオプションです。どちらも、最初の、または両方を与えることはできません。 3つの引数のそれぞれに、同じペアの区切り文字を使用する必要があることに注意してください。左側のスペースは、string1(必要に応じて連結)またはstring1が指定されていない場合はスペースで埋められます。 string1とstring2の両方が指定されている場合、string1が残りのパディングを生成するために使用される前に、string2が各Wordの左側に1回直接挿入され、必要に応じて切り捨てられます。

MULTIBYTEオプションが有効な場合は、フラグmを指定することもできます。その場合、幅がパディングの計算に使用されます。それ以外の場合、個々のマルチバイト文字は1単位の幅を占めるものとして扱われます。

MULTIBYTEオプションが有効になっていない場合、文字列の各バイトは1単位の幅を占めるものとして扱われます。

制御文字は常に1単位幅であると想定されます。これにより、このメカニズムを使用して制御文字の繰り返しを生成できます。

試してみてください:

zmv '([0-9])-([0-9]##).(jpg)' '$1-${(l:3::0:)2}.$3'
3
cuonglm

${(l:3::0:)var}はゼロで埋められますが、3文字を超える長さのvarも切り捨てられることに注意してください(1234234に変更されます)。

もう1つの方法は、typeset -Z3àlakshを使用することです。

typeset -Z3 z3
zmv '([0-9]-)(<->)(.jpg)' '$1${${z3::=$2}+}$z3$3'

上記の${${z3::=$2}+}を使用して、z3への割り当てをトリガーしています。次の$z3z3を展開するので、パディングは0です。

2