Перемещение файла, содержащего пробел в ruby, с помощью FileUtils - PullRequest
1 голос
/ 19 октября 2010

Я использую Mac OS X и пытаюсь написать небольшой скрипт, который перемещает файл в определенную папку.Я использую API-интерфейс FileUtils, поскольку не хочу запускать системные команды (system ("mv ab").

Сценарий выглядит примерно так:

#!/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>'

Для экранирования я использую гем 'escape' в версии 0.0.4, в которой 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 ]

3 голосов
/ 19 октября 2010

вы можете просто не использовать escape

require 'fileutils'
absolut_input_filename = ARGV[0]
move_folder = "/move/to/folder"
FileUtils.mv absolut_input_filename, move_folder
0 голосов
/ 01 июня 2015

Решено с помощью программных ссылок:

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

теперь я могу без проблем использовать команды FileUtils:

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

Надеюсь поможет!

0 голосов
/ 19 октября 2010

Я на самом деле не знаю от 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)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...