1.jpg
、2.jpg
、3.jpg
等命名,一直到1439.jpg
。然而,我的一个项目在字母排序方面出了问题。它通常会按照1.jpg
、10.jpg
、11.jpg
的顺序排列。
我需要的是一种快速高效地将文件命名为00001.jpg
到01439.jpg
这样的格式的方法。
我应该如何快速有效地完成这个任务?
1.jpg
、2.jpg
、3.jpg
等命名,一直到1439.jpg
。然而,我的一个项目在字母排序方面出了问题。它通常会按照1.jpg
、10.jpg
、11.jpg
的顺序排列。
我需要的是一种快速高效地将文件命名为00001.jpg
到01439.jpg
这样的格式的方法。
我应该如何快速有效地完成这个任务?
rename
的脚本。它只是一个小型的Perl脚本,具有许多强大的批量重命名功能,但最好的(在这种情况下)是它能够在替换过程中运行Perl。结果是一个真正简洁的解决方案:
rename 's/\d+/sprintf("%05d", $&)/e' *.jpg
这与其他在这里的printf
风格的答案类似,但是所有的处理都由我们来完成。上面的代码适用于一个5位数(包括可变数量的前导零)。
它将搜索并替换找到的第一个数字字符串为带有零填充的版本,并保持文件名的其余部分不变。这意味着您不必太担心扩展名或前缀的问题。
注意:这并不完全可移植。许多发行版使用util-linux
软件包中的rename.ul
作为默认的rename
二进制文件。这是一个明显受限的替代方案(请参阅man rename.ul
),它无法理解上述内容。如果您想在不使用Perl的rename的平台上使用此功能,请先了解如何安装它。
$ touch {1..19}.jpg
$ ls
10.jpg 12.jpg 14.jpg 16.jpg 18.jpg 1.jpg 3.jpg 5.jpg 7.jpg 9.jpg
11.jpg 13.jpg 15.jpg 17.jpg 19.jpg 2.jpg 4.jpg 6.jpg 8.jpg
$ rename 's/\d+/sprintf("%05d", $&)/e' *.jpg
$ ls
00001.jpg 00005.jpg 00009.jpg 00013.jpg 00017.jpg
00002.jpg 00006.jpg 00010.jpg 00014.jpg 00018.jpg
00003.jpg 00007.jpg 00011.jpg 00015.jpg 00019.jpg
00004.jpg 00008.jpg 00012.jpg 00016.jpg
还有一个前缀示例(我们没有做任何不同的事情):
$ touch track_{9..11}.mp3 && ls
track_10.mp3 track_11.mp3 track_9.mp3
$ rename 's/\d+/sprintf("%02d", $&)/e' *.mp3 && ls
track_09.mp3 track_10.mp3 track_11.mp3
sprintf
的行为类似于其他语言中的sprintf
。 - Oli$&
的意思是什么? - user2740for f in *.jpg ; do if [[ $f =~ [0-9]+\. ]] ; then mv $f `printf "%.5d" "${f%.*}"`.jpg ; fi ; done
编辑
解释:
if [[ $f =~ [0-9]+\. ]]
确保只有文件名是数字(后跟一个点)的文件被重命名。printf "%.5d" NUMBER
添加前导零。"${f%.*}"
去掉扩展名(.jpg),只保留数字。.jpg
在第二个反引号之后再次添加文件扩展名。请注意,这仅适用于文件名为数字的文件。对非数字文件进行左填充前导零需要使用不同的格式。
如果您想尝试,请使用以下命令:
for f in *.jpg ; do if [[ $f =~ [0-9]+\. ]] ; then echo mv $f `printf "%.5d" "${f%.*}"`.jpg ; fi ; done
编辑2
通过确保只重命名数字文件名,使命令更加安全。请注意,任何已存在的文件名为00001.jpg的文件将被覆盖。
extensions = (".jpg", ".jpeg", ".tiff")
。
将文本复制到一个空文件中,保存为rename.py
,然后输入文件目录的正确路径(sourcedir
),您希望新名称具有的位数(number_ofdigits
)以及要重命名的文件扩展名(extensions
)。
通过以下命令运行它:
python3 /path/to/script/rename.py
脚本:
#!/usr/bin/python3
import shutil
import os
sourcedir = "/path/to/files"; number_ofdigits = 5; extensions = (".jpg", ".jpeg")
files = os.listdir(sourcedir)
for item in files:
if item.endswith(extensions):
name = item.split("."); zeros = number_ofdigits-len(name[0])
newname = str(zeros*"0")+name[0]+"."+name[1]
shutil.move(sourcedir+"/"+item, sourcedir+"/"+newname)
编辑:
以下是稍微改进的版本。它会自动确定目录中最长的名称,并在最长名称的长度之前添加前导零。
示例:
1.jpg
12.jpg
123.jpg
变成:
001.jpg
012.jpg
123.jpg
不需要设置数字的位数。
#!/usr/bin/python3
import shutil
import os
sourcedir = "/path/to/files"; extensions = (".jpg", ".jpeg")
files = [(f, f[f.rfind("."):], f[:f.rfind(".")]) for f in os.listdir(sourcedir)if f.endswith(extensions)]
maxlen = len(max([f[2] for f in files], key = len))
for item in files:
zeros = maxlen-len(item[2])
shutil.move(sourcedir+"/"+item[0], sourcedir+"/"+str(zeros*"0")+item[0])
rename 's/\d+/sprintf("%05d",$&)/e' *.jpg
第一个参数是一个Perl表达式,它会对每个文件名进行求值。
cpan
并运行cpan1> install File::Rename
来安装File::Rename模块。 - SergioAraujosudo apt install rename
进行安装。 - Mats Kindahl{num5}
是什么样的模式格式? - Kaz Wolfeforeach (<*.jpg>) { rename $_, sprintf("%03d.jpg", $1) if /^(\d+).jpg/; }
当我们说foreach
时,我们可以通过$_
引用文件。
但是您可以使用以下命令安装适当的perl-rename
。
cpan
cpan1> install File::Rename
另一种轻松重命名这些文件的方法是使用 Ranger 文件管理器打开文件夹,选择所有文件,运行 :bulkrename
并使用以下 vim 命令:
:%s/^\d\+/\=printf("%03d", submatch(0))
我也尝试过使用ls + awk。
ls -1 | awk -F. '{printf "%s%s%s%03d.%s\n", "mv ", $0, " ", $1, $2}'
每个字符串或数字都必须与printf函数关联,输出结果将类似于以下内容:
mv 9.jpg 009.jpg
要真正使用这个进行重命名,你必须在末尾添加| sh
。
ls -1 | awk -F. '{printf "%s%s%s%03d.%s\n", "mv ", $0, " ", $1, $2}' | sh
zmv
模块,类似于外部的mmv命令,并且它还支持在其shell glob中使用数字范围<m-n>
。因此,例如给定:
% ls *.mp4
'3 - Ariane Rocket Disaster.mp4' '81 - Proof of Guarantee (Sketch).mp4'
'39 - Conditions Example.mp4' '82 - Measured vs. Worst-Case Probability.mp4'
'396 - Execution Path of a Program.mp4' '86 - Coverage of Random Testing.mp4'
'397 - Computation Tree Example.mp4' '88 - Intro to Automated Test Generation.mp4'
'398 - Existing Approach I.mp4' '89 - Outline.mp4'
'399 - Existing Approach II.mp4' '9 - Program Invariants.mp4'
'400 - Combined Approach.mp4' '90 - Korat.mp4'
'401 - An Illustrative Example .mp4' '91 - The Problem.mp4'
'402 - Computation Tree.mp4' '92 - An Insight.mp4'
'403 - Computation Tree Solution.mp4' '94 - Scheme for Representing Shapes.mp4'
'7 - Dynamic Program Analysis.mp4' '95 - Representing Shapes.mp4'
'78 - Concurrency Bug Depth Solution.mp4' '96 - Representing Shapes Solution.mp4'
'79 - Cuzz Algorithm.mp4' '97 - A Simple Algorithm.mp4'
'8 - Static Program Analysis.mp4' '98 - Enumerating Shapes.mp4'
'80 - Probabilistic Guarantee.mp4' '99 - Enumerating Shapes Solution.mp4'
然后一旦模块加载完成
% autoload -Uz zmv
你可以做
% zmv -n '(<1-99>) - (*.mp4)' '${(l:3::0:)1} - ${2}'
mv -- '3 - Ariane Rocket Disaster.mp4' '003 - Ariane Rocket Disaster.mp4'
mv -- '39 - Conditions Example.mp4' '039 - Conditions Example.mp4'
mv -- '7 - Dynamic Program Analysis.mp4' '007 - Dynamic Program Analysis.mp4'
mv -- '78 - Concurrency Bug Depth Solution.mp4' '078 - Concurrency Bug Depth Solution.mp4'
mv -- '79 - Cuzz Algorithm.mp4' '079 - Cuzz Algorithm.mp4'
mv -- '8 - Static Program Analysis.mp4' '008 - Static Program Analysis.mp4'
mv -- '80 - Probabilistic Guarantee.mp4' '080 - Probabilistic Guarantee.mp4'
mv -- '81 - Proof of Guarantee (Sketch).mp4' '081 - Proof of Guarantee (Sketch).mp4'
mv -- '82 - Measured vs. Worst-Case Probability.mp4' '082 - Measured vs. Worst-Case Probability.mp4'
mv -- '86 - Coverage of Random Testing.mp4' '086 - Coverage of Random Testing.mp4'
mv -- '88 - Intro to Automated Test Generation.mp4' '088 - Intro to Automated Test Generation.mp4'
mv -- '89 - Outline.mp4' '089 - Outline.mp4'
mv -- '9 - Program Invariants.mp4' '009 - Program Invariants.mp4'
mv -- '90 - Korat.mp4' '090 - Korat.mp4'
mv -- '91 - The Problem.mp4' '091 - The Problem.mp4'
mv -- '92 - An Insight.mp4' '092 - An Insight.mp4'
mv -- '94 - Scheme for Representing Shapes.mp4' '094 - Scheme for Representing Shapes.mp4'
mv -- '95 - Representing Shapes.mp4' '095 - Representing Shapes.mp4'
mv -- '96 - Representing Shapes Solution.mp4' '096 - Representing Shapes Solution.mp4'
mv -- '97 - A Simple Algorithm.mp4' '097 - A Simple Algorithm.mp4'
mv -- '98 - Enumerating Shapes.mp4' '098 - Enumerating Shapes.mp4'
mv -- '99 - Enumerating Shapes Solution.mp4' '099 - Enumerating Shapes Solution.mp4'
在替换变量扩展中,(l:3::0:)
是一个修饰符,它使用字符串0将左侧填充到宽度3。
如果您对建议的重命名满意,请删除-n
标志。
for file in `(find * -maxdepth 1 -type f -name "*.jpg")`
do
mv $file "000"$file
done
这个方法有点粗糙,因为它没有智能地进行重命名,需要想一个办法解决这个问题。但是它应该能帮助你整理东西。
更新:好吧,你有一个更完整的答案。
ls -v
http://unix.stackexchange.com/questions/33909/list-files-sorted-numerically - WernerCDpyrenamer
中尝试过但未成功。 - Parto