我正在使用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
答案 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")
希望会有所帮助!