batch-file - 通过用零填充来批量重命名连续文件

标签 batch-file rename batch-rename

我有一堆这样命名的文件:

output_1.png
output_2.png
...
output_10.png
...
output_120.png

重命名它们以匹配约定的最简单方法是什么,例如最多四位小数,以便文件被命名为:

output_0001.png
output_0002.png
...
output_0010.png
output_0120.png

这在 Unix/Linux/BSD 中应该很容易,尽管我也可以访问 Windows。任何语言都可以,但我对一些非常简洁的俏皮话感兴趣(如果有的话?)。

最佳答案

Python

import os
path = '/path/to/files/'
for filename in os.listdir(path):
    prefix, num = filename[:-4].split('_')
    num = num.zfill(4)
    new_filename = prefix + "_" + num + ".png"
    os.rename(os.path.join(path, filename), os.path.join(path, new_filename))

假设所有以“output_”开头并以“.png”结尾的文件都是有效文件,您可以编译有效文件名列表:

l = [(x, "output" + x[7:-4].zfill(4) + ".png") for x in os.listdir(path) if x.startswith("output_") and x.endswith(".png")]

for oldname, newname in l:
    os.rename(os.path.join(path,oldname), os.path.join(path,newname))
<小时/>

重击

(来自:http://www.walkingrandomly.com/?p=2850)

换句话说,我将 file1.png 替换为 file001.png,将 file20.png 替换为 file020.png,依此类推。以下是如何在 bash 中执行此操作

#!/bin/bash
num=`expr match "$1" '[^0-9]*\([0-9]\+\).*'`
paddednum=`printf "%03d" $num`
echo ${1/$num/$paddednum}

将上述内容保存到名为 zeropad.sh 的文件中,然后执行以下命令使其可执行

chmod +x ./zeropad.sh

然后您可以使用 zeropad.sh 脚本,如下所示

./zeropad.sh frame1.png

它将返回结果

frame001.png

剩下的就是使用此脚本重命名当前目录中的所有 .png 文件,以便将它们补零。

for i in *.png;do mv $i `./zeropad.sh $i`; done
<小时/>

Perl

(来自:Zero pad rename e.g. Image (2).jpg -> Image (002).jpg)

use strict;
use warnings;
use File::Find;

sub pad_left {
   my $num = shift;

   if ($num < 10) {
      $num = "00$num";
   }
   elsif ($num < 100) {
      $num = "0$num";
   }

   return $num;
}

sub new_name {
   if (/\.jpg$/) {
      my $name = $File::Find::name;
      my $new_name;
      ($new_name = $name) =~ s/^(.+\/[\w ]+\()(\d+)\)/$1 . &pad_left($2) .')'/e;
      rename($name, $new_name);
      print "$name --> $new_name\n";
   }
}

chomp(my $localdir = `pwd`);# invoke the script in the parent-directory of the
                            # image-containing sub-directories

find(\&new_name, $localdir);
<小时/>

重命名

同样来自上面的答案:

rename 's/\d+/sprintf("%04d",$&)/e' *.png

关于batch-file - 通过用零填充来批量重命名连续文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5417979/

相关文章:

windows - 从 Windows 批处理文件中检测与 ANSI 兼容的控制台?

ms-access - 如何重命名Access DB中的主键值

audio - 如何批量重命名许多音频文件?

windows - 从子文件夹中解压并重命名为父文件夹

windows - 在 Windows 中将批处理文件命令拆分为多行

batch-file - 在另一个批处理文件完成后执行批处理文件

windows - 使用变量重命名文件

regex - Linux重命名命令首字母大写

Python:我有具有相同列名的 Pandas 数据框。如何改变其中之一?

regex - 以编程方式从文件名中删除日期