混合Ruby和bash命令 - mv返回" x和y是相同的文件"

时间:2014-05-30 21:36:25

标签: ruby-on-rails ruby linux bash shell

所以我有一个Ruby脚本(使用Ruby,因为我们有一个我需要使用的预先存在的代码库)。在Ruby中我使用反引号来调用Linux命令,特别是在这种情况下," mv"命令。我试图将一个文件移动到另一个位置,但我不断收到错误消息,即x和y是"同一个文件"即使它们非常明显不是同一个文件。

以下是Ruby中的代码:

#!/usr/local/rvm/rubies/ruby-2.1.1/bin/ruby

masterFiles=[]
masterFiles << "/mnt/datadrive/Data Capture/QualityControl/UH_HRA_SVY/Scans and DataOutput/Data/UH_HRA_SVY_DATA.txt"
masterFiles << "/mnt/datadrive/Data Capture/QualityControl/UH_HRA_SVY_SPAN/Scans and DataOutput/Data/UH_HRA_SVY_SPAN_DATA.txt"

tm=Time.new.strftime("%Y%m%d")

masterFiles.each do |mf|
  if File.exist?(mf)
    qmf=39.chr + mf + 39.chr
    `cat #{qmf} >> /tmp/QM`
    savename=39.chr + \
      "/mnt/datadrive/Data Capture/QualityControl/UH_HRA_SVY/Scans and DataOutput/Data/DailyFiles/" + \
      File.basename(mf).gsub(".txt","_"+tm) + ".txt" + 39.chr
    `mv #{qmf} #{savename}`
  end
end

我得到的错误是:

  

mv: `/mnt/datadrive/Data Capture/QualityControl/UH_HRA_SVY_SPAN/Scans and DataOutput/Data/UH_HRA_SVY_SPAN_DATA.txt' and `/mnt/datadrive/Data Capture/QualityControl/UH_HRA_SVY/Scans and DataOutput/Data/DailyFiles/UH_HRA_SVY_SPAN_DATA_20140530.txt' are the same file

如果我更改此行:

`mv #{qmf} #{savename}`

对此:

puts "mv #{qmf} #{savename}"

然后运行输出,它按预期工作。

我很确定这与路径中的空格有关。我已经尝试了双引号,三引号,四引号和反向削减的每种组合,我可以想到解决这个问题,但没有去。我也尝试过使用FileUtils.mv,但得到的基本相同的错误措辞不同。

有人可以帮忙吗?非常感谢。

P.S。我意识到我完全有可能以完全错误的方式解决这个问题,所以如果是这样的话,请随时指出。但是,我正在尝试使用我已经掌握(cat,mv等)知识的工具,而不是重新发明轮子。

1 个答案:

答案 0 :(得分:1)

您可以使用FileUtils.mv

我经常这样做别名:

require 'fileutils'

def mv(from, to)
  FileUtils.mv(from, to)
end

在mv()方法中,我做了额外的安全措施,即如果文件不存在,如果缺少权限等等。

如果您仍然遇到包含“空白字符”的文件名问题,请尝试将文件放入“”引号中,如:

your_target_location = "foo/bar bla"