代码之家  ›  专栏  ›  技术社区  ›  leifg

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

  •  1
  • leifg  · 技术社区  · 15 年前

    我正在使用MacOSX,我正在尝试编写一个小脚本,将文件移动到特定的文件夹中。我使用的是fileutilsAPI,因为我不想运行特定于系统的命令(system(“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 回复  |  直到 11 年前
        1
  •  3
  •   ghostdog74    15 年前

    你不能用逃跑

    require 'fileutils'
    absolut_input_filename = ARGV[0]
    move_folder = "/move/to/folder"
    FileUtils.mv absolut_input_filename, move_folder
    
        2
  •  0
  •   zwol    15 年前

    我实际上不知道Ruby的情况,所以用一粒盐来处理这个问题,但是我知道内部和外部的底层OS原语,而且从C可以用它来处理 rename(2) . 因此,从鲁比,你 应该 可以这样做 File.rename 不需要报价。试试这个:

    #! /usr/bin/env ruby
    
    tomove = ARGV[0]
    target = "/path/to/target/folder"
    
    File.rename(tomove, File.join(target, File.basename(tomove)))
    
        3
  •  0
  •   Iwan B.    11 年前

    使用软链接解决:

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

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

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

    希望会有所帮助!