シェルで複数のファイルの名前を一括変更しようとしていますが、インターネットにはこれに関する資料がたくさんありますが、特定の状況に適したソリューションを見つけることができないようです。
「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
rename
Perlパッケージに含まれているユーティリティを使用して、次のことができます。
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