Rubyで1つのコマンドでディレクトリ/ファイル/シンボリックリンクが存在するかどうかを確認する方法


83

ディレクトリ/ファイル/シンボリックリンクなどを検出する単一の方法はありますか?エンティティ(より一般化された)は存在しますか?

ディレクトリ、ファイル、またはシンボリックリンクである可能性のあるパスの配列をチェックする必要があるため、単一の関数が必要です。私File.exists?"file_path"はディレクトリとファイルで機能することを知っていますが、シンボリックリンク(であるFile.symlink?"symlink_path")では機能しません。


1
どのバージョンのRubyを使用していますか?ファイルが存在しています?OS X10.6.6のRuby1.9.2でシンボリックリンクを使用できます

1
明確にするために:シンボリックリンクのtrue場合、最終的に非シンボリックリンクに解決できるかどうかに関係なく、シンボリックリンクが存在する場合に返されるものを求めています。つまりtrue、壊れたリンクについても返されるはずです。壊れていないシンボリックリンクに対してFile.exists?のみ返さtrueれます。
ケルビン

回答:


147

標準のファイルモジュールには、通常のファイルテストがあります。

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

あなたはそこであなたが欲しいものを見つけることができるはずです。


OP:「ありがとう、でも3つすべてが正しいか間違っている必要がある」

明らかにそうではありません。OK、次のようなものを試してください:

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ファイル結合を使用する必要があります。また、Rails.rootRailsを使用している場合は、そこから始めてみませんか。File.exists?(Rails.root.join('db', 'my_seeds.csv')
Cyril Duchon-Doris 2016

2
WindowsはBash、つまり.bashrcを認識していないため、クロスプラットフォームで動作しないことが保証されています。ただし、* nixベースのプラットフォームでは機能します。/ただし、WindowsではRubyのIOがスラッシュからバックスラッシュに自動的に変換されるため、の使用は問題ではありません。
ブリキの

たぶんそれは2016年12月に真実でしたが、Windows最近Bashについて間違いなく知っています。:-)bashスタートメニューに入力すると、表示されるコンソールウィンドウにcat ~/.bashrc出力が表示されます。¯\ _(ツ)_ /¯
ジョナサン・ギルバート

残念ながら、Cyrilの答えは完全には正しくありません。文字列の連結は、Windowsで機能しますか?ブリキの木こりがすでに指摘したように、チェックします。確認のためにこのコメントをここに追加しただけです。
シェビー2018年

14

独自の関数File.exists?(path) or File.symlink?(path)を定義して使用してみませんか?


2
@ClawsyあなたはGintautasの要点を見逃していると思います:あなたはプログラマーです-必要な関数が存在しない場合は、それを作成できます。
Telemachus 2011

4
それがすでに言語の一部であるのに、なぜ車輪を再発明するのですか?
ブリキの

11
プログラミングで細部にこだわらないことが非常に便利だと思います。問題を解決するための簡単で簡単な方法を知っている場合は、それを実行してください。しばらくしてからより良い方法を見つけた場合は、いつでも戻って修正できます。この状況では、新しい関数を定義するのは簡単です。
Gintautas Miliauskas 2011

5
ただし、この機能はすでに言語に組み込まれており、簡単に使用できます。次に、何が利用可能かを確認して呼び出しを追加する場合になります。言語に付属しているRDocを読むのに時間がかからなかったという理由だけで、すでに存在する機能を実装するためのコードを書くことは...私には足りません。そのロジックによって、標準ライブラリを書き直すことになります。
ブリキの

2
File.existを使用しますか?File.existsの代わりに?これはruby2.2.0で
atw
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.