ruby の File.exist? メソッドで大文字小文字を区別してファイルの存在検査を行ないたいのですがうまくいきません。
例えば、/etc というディレクトリは自分のマシンに存在するのですが、'/ETC' で検査しても存在すること(true)になります。これを '/ETC' で検査した場合は false にしたいということです。
### 環境
- OS X 10.6.2
- ruby 1.8.7
### 実行結果
$ ruby -e "p File.exist?('/etc')" #=> true
$ ruby -e "p File.exist?('/ETC')" #=> true になってしまう。これを false と判定したい。
よろしくお願いいたします。
No.1ベストアンサー
- 回答日時:
そもそもMacOSはファイル名の大文字小文字を区別しませんので、
etc,Etc,eTc,etC,ETc,EtC,eTC,ETC はすべて等価です。
なので判定したいしたくない以前の問題なんじゃないでしょうか?
どうしてもというのでしたら、
真の場合にファイル名を文字列として判別する課程も追加すればいいと思いますが、
環境によっては意図通りの働きをしてくれないかもしれません。
P.S.
MacOSの設定で大文字小文字を区別するようにもできますが、
影響範囲が大きいのでどこでどんなエラーが発生するか分からない上、
余所の環境では結局何も変わりないのでお勧めしません。
この回答への補足
ご回答ありがとうございます。
>> そもそもMacOSはファイル名の大文字小文字を区別しませんので、
あーそうでした。すいません。
>> 真の場合にファイル名を文字列として判別する課程も追加すればいいと思いますが、
対象ディレクトリ内のファイル名一覧を取得して、
対象ファイル名が case sensitive でマッチするかを検査するといった流れでしょうか?
アドバイスを元に以下のように検査してみました。
対象ディレクトリ一覧
$ ruby -e 'Dir.glob("/*"){|f|p f}'
... 略
"/Developer"
"/etc"
"/home"
... 略
### 検査実行
"/etc" があるか?
$ ruby -e 'Dir.glob("/*"){ |f| if f =~ /\/etc/ then puts f << ":マッチ" else puts f end}'
...
/Developer
/etc:マッチ
/home
...
"/ETC" があるか?
$ ruby -e 'Dir.glob("/*"){ |f| if f =~ /\/ETC/ then puts f << ":マッチ" else puts f end}'
...
/Developer
/etc
/home
...
>> MacOSの設定で大文字小文字を区別するようにもできますが、
>> 影響範囲が大きいのでどこでどんなエラーが発生するか分からない上、
そのようですね。
助言ありがとうございます。
No.2
- 回答日時:
MacのOSについては、よくわかりませんが、#1の方の回答では、ファイル名の大文字と小文字は区別されないそうです。
windowsでも、同様にファイル名の大文字と小文字は区別されません。私が、windowsで、質問者様と同じような状況になった場合、大文字をと小文字を区別せずに、ファイルの存在のチェックをおこなうと思います。直接的な回答ではありませんが、どうして、大文字と小文字を区別されたいのか、その理由を提示されると、又、べつの回答が得られるかと思います。基本的には#1のかたが言われるとおり、大文字をと小文字を区別しない方法をとるのがよいかと思います。この回答への補足
ご回答ありがとうざいます。
>> どうして、大文字と小文字を区別されたいのか、その理由を提示されると
ちょっと ruby スクリプトのポータビリティについて調査してました。
素朴な疑問としてご理解いただけると幸いです。
>> 基本的には#1のかたが言われるとおり、大文字をと小文字を区別しない方法をとるのがよいかと思います。
そうですね。
ちなみに centos ext3 で同じように検査すると
大文字小文字を区別するようです。
$ruby -e 'p File.exist?("/etc")'
true
$ruby -e 'p File.exist?("/ETC")'
false
これはファイルシステムに依存する挙動として理解しました。
助言ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- Ruby Ruby / passenger のインストールについて 1 2023/01/30 18:31
- PHP imageフォルダに、画像をリサイズして保存する時のファイル名を変更したい 1 2023/05/30 11:39
- Ruby MacBookAir起動時にRubyソースコードをコマンドラインで実行するには? MacのOS起動時 1 2022/04/18 01:55
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Ruby Gitのクローンについて 3 2022/04/10 12:28
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- その他(SNS・コミュニケーションサービス) 爆サイやっていたら、下のような文字が出ました! これは何なのでしょうか? nginx error! 1 2023/06/09 12:27
- その他(プログラミング・Web制作) VB.NETの正規表現について 4 2022/04/12 16:54
- 英語 北海道大学の問題です。 Lose your memory and you, as you, ceas 3 2023/05/04 21:55
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
1、Rstudioで回帰直線を求める...
-
パソコンのスクリーンセーバー...
-
ビーリアルのユーザー名を変え...
-
じゃんけんのプログラムを作っ...
-
pandasでsqlite3にテーブル作成...
-
Gitのクローンについて
-
C言語の入力した文字を反転させ...
-
パイソンエラーについて
-
(再質問)エクセルのマクロボ...
-
c言語でランタイムエラーの処理...
-
教えてください
-
100万件越えCSVから条件を満た...
-
ターミナルからemacsへのコピペ...
-
プログラミング
-
講義でわからないのですが以下...
-
VBA メモ帳の上書き保存がしたい
-
Accessで文字列のバイト数読み込み
-
Ubuntuのシェルスクリプトのgre...
-
符号付整数の演算結果を答えよ ...
-
情報の表現。()内がどうしても...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
小文字wと大文字Wの区別
-
プログラミング言語で大文字と...
-
「大文字・小文字・スペース」...
-
Filterで大文字、小文字の区別
-
Ruby expect 条件文(if文)の書き方
-
Ruby / passenger のインストー...
-
システムエンジニアの適正について
-
初心者 パイソンプログラム
-
プログラミング講師はまだ需要...
-
VB.NETで階乗を求めるプログラ...
-
web上のhtmlファイルから文字デ...
-
RubyでNo such file or directo...
-
Rubyの.soについて
-
九九の表示
-
ruby の Σ計算
-
バーコードのチェックデジット...
-
CかC++どちらを覚えるべきですか?
-
Rubyのpopen3について
-
We're sorry, but something we...
-
ruby.exeとrubyw.exeに違いがあ..
おすすめ情報