使用FileUtils在ruby中移动包含空格的文件

时间:2010-10-18 21:44:15

标签: ruby file

我正在使用Mac OS X而我正在尝试编写一个将文件移动到特定文件夹的小脚本。我正在使用FileUtils API,因为我不想运行系统特定的命令(系统(“mv a b”)。

脚本看起来像这样:

#!/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 / path / to / file \ with \ space

/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中的'escape'gem,其中shell_single_word看起来像这样:

  def shell_single_word(str)
    if str.empty?
      "''"
    elsif %r{\A[0-9A-Za-z+,./:=@_-]+\z} =~ str
      str
    else
      result = ''
      str.scan(/('+)|[^']+/) {
        if $1
          result << %q{\'} * $1.length
        else
          result << "'#{$&}'"
        end
      }
      result
    end
  end

3 个答案:

答案 0 :(得分:3)

你可以不使用逃生

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

答案 1 :(得分:0)

我实际上并不是从Ruby那里知道的,所以请考虑一下这个问题,但我知道内部和外部的底层操作系统原语,并且从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))) 根本不需要引用。试试这个:

{{1}}

答案 2 :(得分:0)

使用软链接解决:

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

现在我可以毫无问题地使用FileUtils命令:

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

希望会有所帮助!