你的程序有兩個主要問題。
首先是您在數組arr
中使用了越界值。試試這個a = [1,2,3]; a[a.count]
,你會得到nil
,因爲你是在訪問a[3]
努力,但在數組中的最後一個元素的索引是2
然後,您使用作爲名稱fileINDEX.txt
總是2...foobar
指標而沒有考慮到一些指標可能已經在您的目錄中使用。
額外的問題,你正在使用Dir.entries
,這在我的操作系統提供了更多的定期條目.
和..
應該妥善管理,他們不是你想要操縱。所以,我給你寫了一個小小的腳本,希望你覺得它可讀,對我來說很有用。你可以改進它! (我在Linux操作系統下)。
# Global var only to stress its importance
$dir = "/home/p/tmp/t1"
Dir.chdir($dir)
# get list of files
fnames = Dir.glob "*"
# get the max index "fileINDEX.txt" already used in the directory
takenIndexes = []
fnames.each do |f|
if f.match /^file(\d+).txt/ then takenIndexes.push $1.to_i; end
end
# get the first free index available
firstFreeIndex = 1
firstFreeIndex = (takenIndexes.max + 1) if takenIndexes.length > 0
# get a range of fresh indexes for possible use
idxs = firstFreeIndex..(firstFreeIndex + (fnames.length))
# i transform the range to list and reverse the order because i want
# to use "pop" to get and remove them.
idxs = idxs.to_a
idxs.reverse!
# rename the files needing to be renamed
puts "--- Renamed files ----"
fnames.each do |f|
# if file has already the wanted format then move to next iteration
next if f.match /^file\d+.txt/
newName = "file" + idxs.pop.to_s + ".txt"
puts "rename: #{f} ---> #{newName}"
File.rename(f, newName)
end