我正在尝试编写一个脚本,该脚本将获取文件夹的目录路径,并将该文件夹中的所有文件重命名为名称和数字。例如,将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,我认为这是开箱即用的系统。
答案 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
标志,它将应用更改。