2015-08-24 66 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