批量重命名文件为顺序编号

Nic*_*lla 5 shell bash shell-script rename

我试图在我的 shell 中批量重命名一堆文件,即使互联网上有很多关于它的材料,我似乎无法找到适合我的特定情况的解决方案。

我有一堆具有(似乎是)“时间戳 ID”的文件:

abc_128390.png
abc_138493.png
abc_159084.png
...
Run Code Online (Sandbox Code Playgroud)

我想换一个柜台:

abc_001.png
abc_002.png
abc_003.png
...
Run Code Online (Sandbox Code Playgroud)

我(很多)天真的方法是这样的:

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

另外,我想不出一种方法让它与for-loop 一起工作。

不幸的rename是,FWIW在这个特定系统上不可用。

任何建议将不胜感激!

Ulr*_*arz 6

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

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

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

  • 将目标文件名更改为 `"$(printf "abc_%03d.png" "$i")"` 以获取零填充 (5认同)

αғs*_*нιη 6

rename实用程序作为 Perl 包的一部分,您可以:

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

注意:-n用于试运行,将其删除以重命名应用于文件。