如何使用Ruby中的一个命令检查目录/文件/符号链接是否存在


81

有没有一种方法可以检测目录/文件/符号链接/等。实体(更广义)存在吗?

我需要一个函数,因为我需要检查可能是目录,文件或符号链接的路径数组。我知道File.exists?"file_path"适用于目录和文件,但不适用于符号链接(即File.symlink?"symlink_path")。


1
您正在使用哪个版本的Ruby?文件已存在?在OS X 10.6.6的Ruby 1.9.2中为我工作的符号链接

1
需要说明的是:对于符号链接,您要求的是返回true是否存在符号链接的东西,而不管它是否最终可以解析为非符号链接。即它也应该返回true断开的链接。File.exists?只会返回true没有中断的符号链接。
开尔文

Answers:


146

标准文件模块具有可用的常规文件测试

RUBY_VERSION # => "1.9.2"
bashrc = ENV['HOME'] + '/.bashrc'
File.exist?(bashrc) # => true
File.file?(bashrc)  # => true
File.directory?(bashrc) # => false

您应该能够在那里找到想要的东西。


OP:“谢谢,但我需要全部三个对或错”

显然不是。好的,尝试类似:

def file_dir_or_symlink_exists?(path_to_file)
  File.exist?(path_to_file) || File.symlink?(path_to_file)
end

file_dir_or_symlink_exists?(bashrc)                            # => true
file_dir_or_symlink_exists?('/Users')                          # => true
file_dir_or_symlink_exists?('/usr/bin/ruby')                   # => true
file_dir_or_symlink_exists?('some/bogus/path/to/a/black/hole') # => false

1
我建议不要进行ENV['HOME'] + '/.bashrc'可能无法跨平台使用的原始字符串连接()。您应该使用Ruby File连接,Rails.root如果使用Rails,为什么不从此开始。File.exists?(Rails.root.join('db', 'my_seeds.csv')
西里尔·杜尚·多丽丝

2
由于Windows不了解Bash,因此也不了解.bashrc,因此可以保证不能跨平台工作。但是它可以在基于* nix的平台上工作。/不过,使用不是问题,因为Ruby的IO在Windows上会自动从正斜杠转换为反斜杠
Tin Man

也许这在2016年12月是正确的,但是这些天Windows确实了解Bash。:-)我可以输入bash“开始”菜单,然后在出现的控制台窗口中cat ~/.bashrc生成输出。¯\ _(ツ)_ /¯
乔纳森吉尔伯特

不幸的是,西里尔(Cyril)的回答并不完全正确-字符串串联在Windows上是否可以用于“ File.exist”?正如“锡曼”已经指出的那样进行检查。我仅在此处添加此评论以确认。
shevy

13

为什么不定义自己的函数File.exists?(path) or File.symlink?(path)并使用它呢?


2
@Clawsy我认为您缺少Gintautas的观点:您是一名程序员-如果所需的功能不存在,则可以创建它。
Telemachus,

4
当轮子已经成为语言的一部分时,为什么还要重新发明轮子呢?
锡人

11
我发现在编程中不要过多地关注细节非常有用。如果您知道解决问题的简单明了的方法,那就去做。如果一段时间后您发现更好的方法,则可以随时返回并进行修复。在这种情况下,轻松定义新功能是很容易的。
Gintautas Miliauskas,2011年

5
但是,该功能已经内置在语言中,并且易于使用。然后变成阅读以查看可用内容并添加呼叫的情况。编写代码来实现已经存在的功能,只是因为您没有花时间阅读该语言附带的RDoc ...只是对我不利。通过这种逻辑,您最终可能会重写标准库。
锡人

2
使用File.exist?而不是File.exists?因为这在ruby 2.2.0中已弃用:ruby-doc.org/core-2.2.0/File.html#method-c-exists-3F
atw 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.