执行shell命令检查文件或目录存在不在ruby中工作

时间:2014-11-12 22:58:19

标签: ruby

我想在从远程服务器删除它之前检查文件或目录是否存在(使用net-ssh gem连接到远程服务器)。但条件[ -f #{path}/#{name} ] || [ -d #{path}/#{name} ]正在返回nil。即使文件/目录不存在,echo $?始终返回0

我知道它应该很简单,我花了很多时间在这上面但却无法使它发挥作用。有人可以帮我吗?

def del(path, name)
        @cond = "[ -f #{path}/#{name} ] || [ -d #{path}/#{name} ]"
        @check = "echo $?"
        @rm_cmd = "rm -rf #{file_or_dir}"

        begin
             res = @ssh.exec!(@cond)
             puts res # returns nil
             ret = @ssh.exec!(@check)
             puts ret # returns 0

             if ret.to_i == 0
                res = @ssh.exec!(@rm_cmd)
             end

             rescue
                 puts "\t#{file_or_dir} does not exist...".capitalize.red

      end
    end

2 个答案:

答案 0 :(得分:1)

我认为你正在使用ssh.exec执行三个shell!你有没有同时尝试过这个条件和检查:

ret = @ssh.exec!("sh -c '[ -f #{path}/#{name} ] || [ -d #{path}/#{name} ]; echo $?'")

答案 1 :(得分:0)

为什么使用shell脚本执行此操作时Ruby可以使用FileFileStat中的方法执行此操作。

  

文件::统计

     

类File :: Stat的对象封装了File对象的公共状态信息。在创建File :: Stat对象时记录信息;在该点之后对文件所做的更改将不会被反映。 File :: Stat对象由IO#stat,File :: stat,File#lstat和File :: lstat返回。其中许多方法返回特定于平台的值,并非所有值都在所有系统上都有意义。另请参阅内核#test。

文件包含FileStat,因此您可以方便地使用所有FileStat的方法。请参阅file?dir?以确定是否存在某些内容,并分别是文件或目录。如果您只想弄清楚是否存在某些内容,请使用exist?