通过用零填充来批量重命名顺序文件

slh*_*hck 30 rename batch-file batch-rename

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

output_1.png
output_2.png
...
output_10.png
...
output_120.png
Run Code Online (Sandbox Code Playgroud)

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

output_0001.png
output_0002.png
...
output_0010.png
output_0120.png
Run Code Online (Sandbox Code Playgroud)

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

DTi*_*ing 42

蟒蛇

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))
Run Code Online (Sandbox Code Playgroud)

您可以编译有效文件名列表,假设所有以"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))
Run Code Online (Sandbox Code Playgroud)

巴什

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

换句话说,我用file001.png替换file1.png,用file020.png替换file20.png,依此类推.这是在bash中如何做到这一点

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

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

chmod +x ./zeropad.sh
Run Code Online (Sandbox Code Playgroud)

然后,您可以zeropad.sh按如下方式使用脚本

./zeropad.sh frame1.png
Run Code Online (Sandbox Code Playgroud)

这将返回结果

frame001.png
Run Code Online (Sandbox Code Playgroud)

剩下的就是使用这个脚本重命名当前目录中的所有.png文件,使它们被零载.

for i in *.png;do mv $i `./zeropad.sh $i`; done
Run Code Online (Sandbox Code Playgroud)

Perl的

(来自:零垫重命名,例如图像(2).jpg - >图像(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);
Run Code Online (Sandbox Code Playgroud)

改名

也是从上面回答:

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


Joe*_*oey 13

相当简单,虽然它结合了一些不是很明显的功能:

@echo off
setlocal enableextensions enabledelayedexpansion
rem iterate over all PNG files:
for %%f in (*.png) do (
    rem store file name without extension
    set FileName=%%~nf
    rem strip the "output_"
    set FileName=!FileName:output_=!
    rem Add leading zeroes:
    set FileName=000!FileName!
    rem Trim to only four digits, from the end
    set FileName=!FileName:~-4!
    rem Add "output_" and extension again
    set FileName=output_!FileName!%%~xf
    rem Rename the file
    rename "%%f" "!FileName!"
)
Run Code Online (Sandbox Code Playgroud)

编辑:误读您不是在批处理文件之后,而是使用任何语言的任何解决方案.对不起.为了弥补它,PowerShell单线程:

gci *.png|%{rni $_ ('output_{0:0000}.png' -f +($_.basename-split'_')[1])}
Run Code Online (Sandbox Code Playgroud)

?{$_.basename-match'_\d+'}在那里,如果你有不遵循这种模式的其他文件.


Ada*_*dam 6

我实际上只需要在OSX上执行此操作。这是我为此创建的脚本-单行!

> for i in output_*.png;do mv $i `printf output_%04d.png $(echo $i | sed 's/[^0-9]*//g')`; done
Run Code Online (Sandbox Code Playgroud)