2015-08-24 65 views
-1

我有一个目录的文件全名为零键盘的数字未填充

image_1.jpg 
image_2.jpg 
... 
image_10.jpg 
... 
image_335.jpg 

现在我想用一个命令行工具,它预计该图像是按字母顺序排序。但这些文件名的字母顺序是:image_100.jpg image_101.jpg ... image_10.jpg image_11.jpg ... image_1.jpg ...

如何使用短shell/bash命令重命名这些文件?我发现sed是一种可行的方法,但这个工具对我来说是个谜。

+2

也许你的工具,只要使用顺序给出?例如,如果您将它作为'sometool image * .jpg'调用,那么您可以改为'sometool image_ {1..335} .jpg'。 –

+2

http://stackoverflow.com/questions/9896070/pad-numerical-values-in-filename-with-three-digit-value-using-sed – bishop

+0

@thatotherguy没有工具只是期望工作目录充满了有序images:( – sweiler

回答

2

使用bash:

for i in *; do if [[ $i =~ (image_)([0-9]{1,2})(\.jpg) ]]; then printf -v num "%03d" "${BASH_REMATCH[2]}"; echo mv -v "$i" "${BASH_REMATCH[1]}${num}${BASH_REMATCH[3]}"; fi; done 

如果一切正常,删除echo

测试与那些文件名的目录:

 
image_100.jpg 
image_101.jpg 
image_10.jpg 
image_11.jpg 
image_1.jpg 
image_2.jpg 
image_334.jpg 
image_335.jpg 
image_3.jpg 

创建的命令:

 
mv -v image_10.jpg image_010.jpg 
mv -v image_11.jpg image_011.jpg 
mv -v image_1.jpg image_001.jpg 
mv -v image_2.jpg image_002.jpg 
mv -v image_3.jpg image_003.jpg 

结果:

 
image_001.jpg 
image_002.jpg 
image_003.jpg 
image_010.jpg 
image_011.jpg 
image_100.jpg 
image_101.jpg 
image_334.jpg 
image_335.jpg 
0

好,我找到一个解决方案,不使用shell命令,但通过编写一个简单的Ruby脚本:

input = Dir.glob("image*.jpg") 

input.each do |name| 
    parts = name.split /[_\.]/ 
    number = parts[1] 
    number = number.rjust(3, '0') 
    new_name = [parts[0], '_', number, '.', parts[2]].join 
    File.rename(name, new_name) 
end