zmv
を使用して this 質問の解決策を見つけようとしていました。 zmv
を使用して正確な解決策を見つけることができません。これは私がこれまでに思いついたものです。
ここ から、コマンドを使用して、1.jpg
、2.jpg
、34.jpg
などのすべてのファイルの名前を001.jpg
、002.jpg
、034.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.jpg
、0-44.jpg
の場合、上記のコマンドで0-001.jpg
および0-002.jpg
ではなく0-001.jpg
および0-044.jpg
に置き換えられることです。
必要に応じて名前を変更するには、zmv
コマンドをどのように変更する必要がありますか?
-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'
${(l:3::0:)var}
はゼロで埋められますが、3文字を超える長さのvar
も切り捨てられることに注意してください(1234
は234
に変更されます)。
もう1つの方法は、typeset -Z3
àlaksh
を使用することです。
typeset -Z3 z3
zmv '([0-9]-)(<->)(.jpg)' '$1${${z3::=$2}+}$z3$3'
上記の${${z3::=$2}+}
を使用して、z3
への割り当てをトリガーしています。次の$z3
はz3
を展開するので、パディングは0です。