我正在使用Mac OS X,我试图编写一个将文件移动到特定文件夹的小脚本。我使用的文件实用程序API,因为我不希望运行系统特定的命令(系统(“MV AB”)使用FileUtils移动包含红宝石空间的文件
脚本看起来是这样的:
#!/usr/bin/env ruby
require 'rubygems'
require 'escape'
require 'fileutils'
absolut_input_filename = Escape.shell_single_word ARGV[0]
move_folder = Escape.shell_single_word "/move/to/folder"
FileUtils.mv absolut_input_filename, move_folder
只要输入文件名包含没有空间,一切工作正常,但只要我把一个文件的空间误差输出是这样的:
./scripts/success /路径/到/文件\与\空间
/usr/local/Cellar/ruby/1.9.2-p0/lib/ruby/1.9.1/fileutils.rb:1418:in `stat': No such file or directory - '/path/to/file with space' (Errno::ENOENT)
from /usr/local/Cellar/ruby/1.9.2-p0/lib/ruby/1.9.1/fileutils.rb:1418:in `block in fu_each_src_dest'
from /usr/local/Cellar/ruby/1.9.2-p0/lib/ruby/1.9.1/fileutils.rb:1432:in `fu_each_src_dest0'
from /usr/local/Cellar/ruby/1.9.2-p0/lib/ruby/1.9.1/fileutils.rb:1416:in `fu_each_src_dest'
from /usr/local/Cellar/ruby/1.9.2-p0/lib/ruby/1.9.1/fileutils.rb:504:in `mv'
from ./scripts/success:8:in `<main>'
转义我使用“逃跑”的宝石在0.0.4版本,在其中shell_single_word
看起来是这样的:
def shell_single_word(str)
if str.empty?
"''"
elsif %r{\A[0-9A-Za-z+,./:[email protected]_-]+\z} =~ str
str
else
result = ''
str.scan(/('+)|[^']+/) {
if $1
result << %q{\'} * $1.length
else
result << "'#{$&}'"
end
}
result
end
end
更确切地说,'FileUtils'需要一个非转义的字符串,所以只要leifg逃离一个空间,事情就会中断。如果他通过非转义(如你的例子),它会工作得很好。 – 2010-10-19 00:27:46
完美的工作,感谢您的意见 – leifg 2010-10-19 06:25:46