3

拡張子のないファイルを見つけるコードを探しています。Railsにはファイルがありますapp_name/doc/README_FOR_APP。ファイルに拡張子が関連付けられていない、これに似たファイル、つまり「gemfile」を見つける方法を探しています。何かのようなもの:

file = File.join(directory_path, "**", "__something__")
4

3 に答える 3

4

あなたの質問では、拡張子のないファイルを再帰的に検索するかどうか(コメントではそう思われるように聞こえましたが)、または先頭にドットが付いたファイル(つまり、UNIXの隠しファイル)を保持するかどうかを明示的に指定していませんでした。各シナリオのオプションを含めています。

可視ファイル (非再帰)

Dir['*'].reject { |file| file.include?('.') }

「.」を含まないすべてのファイルの配列を返します。したがって、拡張子のないファイルのみです。

隠しファイル (非再帰的)

Dir.new('.').entries.reject { |file| %w(. ..).include?(file) or file[1..-1].include?('.') }

これにより、現在のディレクトリ内のすべてのファイルが検索され、「.」が付いているファイルがすべて削除されます。最初の文字を除く任意の文字 (つまり、インデックス 1 から最後までの任意の文字、別名インデックス -1)。Dir.new('.').entriesまた、 「.」が含まれていることにも注意してください。および「..」も拒否されます。

可視ファイル (再帰)

require 'find'
Find.find('.').reject { |file| File.basename(file).include?('.') }.map { |file| file[2..-1] }

この最後のマップは、先頭の「./」を削除することで、他のマップとの一貫性を維持するだけです。それが気にならなければ、削除できます。

隠しファイル (再帰)

require 'find'
Find.find('.').reject { |file| File.basename(file)[1..-1].include?('.') }.map { |file| file[2..-1] }

注:上記のそれぞれにはディレクトリも含まれます(少なくともUNIXではファイルと見なされることもあります)。それらを削除するに.select { |file| File.file?(file) }は、上記のいずれかの末尾に追加するだけです。

于 2013-04-29T17:14:47.810 に答える
2
Dir.glob(File.join(directory_path, "**", "*")).reject do |path|
  File.directory?(path) || File.basename(path).include?('.')
end

更新:「拡張子」のより厳密な定義を取りたい場合は、ファイル名に拡張子が1つだけあり、そのドットが最初でも最後の文字でもない場合にのみ、ファイル名に拡張子があると見なすもう少し複雑なものがあります名前:

Dir.glob(File.join(directory_path, "**", "*")).reject do |path|
  name = File.basename(path)
  File.directory?(path) || (name.count('.') == 1 && name[-1] != '.')
end

ただし、「ドットがない」ことは、あなたが探していたものだと思います。

于 2013-04-29T17:17:56.960 に答える
0
nonfile = File.join("**", "*.")
Dir.glob(nonfile).each do |path|
    puts path
end

私はいじり回していて、同僚と話していて、これならと思いました。それはうまくいきませんか?

于 2013-04-30T13:38:22.527 に答える