ファイル名を連続した数字に一括変更

ファイル名を連続した数字に一括変更

シェルで複数のファイルの名前を一括変更しようとしていますが、インターネットにはこれに関する資料がたくさんありますが、特定の状況に適したソリューションを見つけることができないようです。

「timestamp-id」と思われる複数のファイルがあります。

abc_128390.png
abc_138493.png
abc_159084.png
...

カウンターを変更したいです。

abc_001.png
abc_002.png
abc_003.png
...

私の(非常に)素朴なアプローチは次のとおりです。

mv abc_*.png abc_{001..123}.png

forまた、ループを使用して操作する方法が見つかりません。

残念ながら、renameこの特定のシステムでは使用できません。

どんなアドバイスもありがとうございました!

答え1

増加するカウンターをよりスマートに処理できるソリューションは思い出せませんが、次のようにすると機能します。

i=0
for fi in abc_??????.png; do
    mv "$fi" abc_$i.png
    i=$((i+1))
done

abc_*.png最初の実行前に拡張されるため、安全に使用する必要がありますmvが、最後に6文字のタイムスタンプを持つファイルだけが必要なので、非常に具体的に指定すると便利です。

答え2

renamePerlパッケージに含まれているユーティリティを使用して、次のことができます。

rename -n 'our $i; s/_.*/sprintf("_%03d.png", $i++)/e' *.png

注:-nテスト実行の場合は、それを削除してファイル名の変更を適用してください。

答え3

そしてzsh

typeset -A count
incr='++count[$1/$2]'
(zmv -n '([^0-9]##)<->(*)(#qn)' '$1${(l:3::0:)$((incr))}$2')

満足のいくものを削除してください-n

incr(変数を使用する追加の手順に注意してください。ACE脆弱性の防止)

例:

$ ls
a1b.png  abc_128390.png  abc_159084.png  x12y.png
a2b.png  abc_138493.png  a.png           x2y.png
$ typeset -A count
$ incr='++count[$1/$2]'
$ (zmv -n '([^0-9]##)<->(*)(#qn)' '$1${(l:3::0:)$((incr))}$2')
mv -- a1b.png a001b.png
mv -- a2b.png a002b.png
mv -- abc_128390.png abc_001.png
mv -- abc_138493.png abc_002.png
mv -- abc_159084.png abc_003.png
mv -- x2y.png x001y.png
mv -- x12y.png x002y.png

答え4

たとえば、ファイル名を変更する場合は、cut を使用してファイル名の一部を切り捨てることができます。

"1 first.jpg"
"2 second.jpg"
...

到着

"10 first.jpg"
"20 second.jpg"
...

あなたはそれを使用することができます

for i in *jpg; do
  mv -iv "$i" "$(echo "$i"|cut -d\  -f1)0 $(echo "$i"|cut -d\  -f2-99)";
done

関連情報