批量将文件重命名为连续编号

批量将文件重命名为连续编号

我正在尝试批量重命名 shell 中的一堆文件,尽管互联网上有大量有关它的材料,但我似乎无法找到适合我的具体情况的解决方案。

我有一堆文件(看起来是)“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循环一起工作。

不幸的是,FWIWrename在此特定系统上不可用。

任何建议将不胜感激!

答案1

我想不出以更聪明的方式处理递增计数器的解决方案,但这应该可行:

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

它应该可以安全使用,abc_*.png因为它在第一个执行之前就已展开mv,但非常具体可能会很有用,因为您只需要末尾带有六个字符时间戳的文件。

答案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

相关内容