2010-10-18 40 views
1

我正在使用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 

回答

3

你可以不使用逃脱

require 'fileutils' 
absolut_input_filename = ARGV[0] 
move_folder = "/move/to/folder" 
FileUtils.mv absolut_input_filename, move_folder 
+1

更确切地说,'FileUtils'需要一个非转义的字符串,所以只要leifg逃离一个空间,事情就会中断。如果他通过非转义(如你的例子),它会工作得很好。 – 2010-10-19 00:27:46

+0

完美的工作,感谢您的意见 – leifg 2010-10-19 06:25:46

0

我真的不从红宝石知道,所以借此与一粒盐,但我知道内部和外部的底层操作系统原语,从C中可以使用rename(2)来完成此操作。因此,从Ruby,你应该应该能够做到这一点File.rename,根本不需要引用。试试这个:

#! /usr/bin/env ruby 

tomove = ARGV[0] 
target = "/path/to/target/folder" 

File.rename(tomove, File.join(target, File.basename(tomove))) 
0

解决使用软链接:

ln -s ~/Folder\ with\ spaces/foo/ ./foo 

现在我可以使用文件实用程序没有问题命令:

FileUtils.cp("bar.txt", "foo/foobar.txt") 

希望会有所帮助!