File.rename在Ruby脚本中抛出无效参数错误以重命名目录中的所有文件

时间:2016-05-04 14:49:48

标签: ruby file scripting scripting-language

我正在尝试编写一个脚本,该脚本将获取文件夹的目录路径,并将该文件夹中的所有文件重命名为名称和数字。例如,将img_0936.JPG,img_0937.JPG重命名为hockeyPic_001.JPG和hockeyPic_002.JPG。

所以这是我的剧本:

folder = '/Users/ShaneWilliamson/Desktop/cobalt pics'
newName = 'cobaltPic'

puts 'Renaming files...'
files = Dir.entries(folder).reject{|f| f[0] == '.'}
puts files

i = 1
files.each do |file|
  File.rename(file, newName + i.to_s + '.JPG')
  i += 1
end

它当前正在返回正确的文件名(在重命名之前),但抛出:

Renaming files...
.
..
.DS_Store
image1.JPG
image2.JPG
image3.JPG
image4.JPG
image5.JPG
IMG_1586.JPG
IMG_1587.JPG
fileNamer.rb:10:in `rename': Invalid argument - . or cobaltPic_001.JPG
(Errno::EINVAL)
from fileNamer.rb:10
from fileNamer.rb:9:in `each'
from fileNamer.rb:9
Shanes-MacBook-Air:Desktop ShaneWilliamson$ 

所以似乎拒绝方法并没有达到我的预期,我认为这可能导致错误(系统不会让脚本更改'隐藏'文件?)。

如果相关,我在MacBook Air上运行OSX 10.7.5。每个'ruby -v'命令的Ruby版本1.8.7,我认为这是开箱即用的系统。

2 个答案:

答案 0 :(得分:1)

快速且相对安全的方法是仅重命名名称不以点开头的文件。这些“.xxx”文件是“隐藏文件”,通常由操作系统或某些软件创建,并且不打算触及它们。

folder = '/Users/ShaneWilliamson/Desktop/cobalt pics'
newName = 'cobaltPic'

Dir.entries(folder).reject{|f| f[0] == '.'}.each_with_index(1) do |file, i|
  File.rename file, "#{newName}#{i}.JPG"
end

答案 1 :(得分:0)

您可以考虑使用现有的实用程序而不是编写自己的实用程序。 rename完成了您要实现的目标,并且可在大多数操作系统上使用。您的整个脚本可以写成:

rename --just-print -N 001 's/.*/cobaltPic$N.jpg/' *.jpg

此命令仅显示脚本将执行的操作,但实际上不会重命名任何内容。验证输出后,您可以删除--just-print标志,它将应用更改。