我有一堆像这样命名的文件:
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。任何语言都没问题,但我对一些非常简洁的单行感兴趣(如果有的话)。
答案 0 :(得分:40)
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
(来自: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
答案 1 :(得分: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!"
)
编辑:误读您不是在批处理文件之后,而是使用任何语言的任何解决方案。对不起。为了弥补它,PowerShell单行:
gci *.png|%{rni $_ ('output_{0:0000}.png' -f +($_.basename-split'_')[1])}
如果您有其他文件不遵循该模式,请将?{$_.basename-match'_\d+'}
粘贴在那里。
答案 2 :(得分:5)
我实际上只需要在OSX上执行此操作。这是我为它创建的脚本 - 单行!
> for i in output_*.png;do mv $i `printf output_%04d.png $(echo $i | sed 's/[^0-9]*//g')`; done
答案 3 :(得分:2)
对于大规模重命名,唯一的安全解决方案是mmv
- 它会检查冲突并允许在链和循环中重命名,这超出了大多数脚本。不幸的是,零填充它不是太热了。味道:
c:> mmv output_[0-9].png output_000#1.png
这是一个解决方法:
c:> type file
mmv
[^0-9][0-9] #1\00#2
[^0-9][0-9][^0-9] #1\00#2#3
[^0-9][0-9][0-9] #1\0#2#3
[^0-9][0-9][0-9][^0-9] #1\0#2#3
c:> mmv <file
答案 4 :(得分:2)
Here是我编写的Python脚本,根据存在的最大数量填充零,并忽略给定目录中的非编号文件。用法:
python ensure_zero_padding_in_numbering_of_files.py /path/to/directory
剧本体:
import argparse
import os
import re
import sys
def main(cmdline):
parser = argparse.ArgumentParser(
description='Ensure zero padding in numbering of files.')
parser.add_argument('path', type=str,
help='path to the directory containing the files')
args = parser.parse_args()
path = args.path
numbered = re.compile(r'(.*?)(\d+)\.(.*)')
numbered_fnames = [fname for fname in os.listdir(path)
if numbered.search(fname)]
max_digits = max(len(numbered.search(fname).group(2))
for fname in numbered_fnames)
for fname in numbered_fnames:
_, prefix, num, ext, _ = numbered.split(fname, maxsplit=1)
num = num.zfill(max_digits)
new_fname = "{}{}.{}".format(prefix, num, ext)
if fname != new_fname:
os.rename(os.path.join(path, fname), os.path.join(path, new_fname))
print "Renamed {} to {}".format(fname, new_fname)
else:
print "{} seems fine".format(fname)
if __name__ == "__main__":
sys.exit(main(sys.argv[1:]))
答案 5 :(得分:1)
$rename output_ output_0 output_? # adding 1 zero to names ended in 1 digit
$rename output_ output_0 output_?? # adding 1 zero to names ended in 2 digits
$rename output_ output_0 output_??? # adding 1 zero to names ended in 3 digits
就是这样!
答案 6 :(得分:0)
我正在关注Adam的OSX解决方案。
我在剧情中遇到的一些问题是:
最后,我的转化线看起来像这样:
for i in *.mp3 ; do mv "$i" `printf "track_%02d.mp3\n" $(basename "$i" .mp3 | sed 's/[^0-9]*//g')` ; done
答案 7 :(得分:0)
使用ls + awk + sh
:
ls -1 | awk -F_ '{printf "%s%04d.png\n", "mv "$0" "$1"_", $2}' | sh
如果要在运行命令之前对其进行测试,只需删除| sh
答案 8 :(得分:0)
使用 bash 拆分,
Linux
for f in *.png;do n=${f#*_};n=${n%.*};mv $f $(printf output_"%04d".png $n);done
windows(bash)
for f in *.png;do n=${f#*_};mv $f $(printf output_"%08s" $n);done
答案 9 :(得分:0)
我只想用
制作延时电影ffmpeg -pattern_type glob -i "*.jpg" -s:v 1920x1080 -c:v libx264 output.mp4
遇到了类似的问题。
<块引用>[image2 @ 000000000039c300] 已选择模式类型“glob”,但此 libavformat 版本不支持 globbing
glob 在 Windows 7 上不支持。 此外,如果文件列表如下所示,并使用 %2d.jpg 或 %02d.jpg
<块引用>1.jpg 2.jpg ... 10.jpg 11.jpg ...
[image2 @ 00000000005ea9c0] Could find no file with path '%2d.jpg' and index in the range 0-4
%2d.jpg: No such file or directory
[image2 @ 00000000005aa980] Could find no file with path '%02d.jpg' and index in the range 0-4
%02d.jpg: No such file or directory
这是我重命名苍蝇的批处理脚本
@echo off
setlocal enabledelayedexpansion
set i=1000000
set X=1
for %%a in (*.jpg) do (
set /a i+=1
set "filename=!i:~%X%!"
echo ren "%%a" "!filename!%%~xa"
ren "%%a" "!filename!%%~xa"
)
重命名 143,323 个 jpg 文件后,
ffmpeg -i %6d.jpg -s:v 1920x1080 -c:v libx264 output.mp4