Ruby'de bir dizi dizin (dosyalar hariç) elde etmenin en hızlı, en optimize, tek satırlık yolu nedir?
Dosyaları dahil etmeye ne dersiniz?
Ruby'de bir dizi dizin (dosyalar hariç) elde etmenin en hızlı, en optimize, tek satırlık yolu nedir?
Dosyaları dahil etmeye ne dersiniz?
Yanıtlar:
Dir.glob("**/*/") # for directories
Dir.glob("**/*") # for all files
Bunun yerine Dir.glob(foo)
yazabilirsiniz Dir[foo]
(ancak Dir.glob
bir blok da alabilir, bu durumda bir dizi oluşturmak yerine her yolu verir).
Dir.glob("**/")
sembolik bağlantılar istemiyorsanız kullanın
File::FNM_DOTMATCH
bayrağı kullanın .
Dir.glob("**/*", File::FNM_DOTMATCH)
Buradaki çözümlerin hiçbirinin gizli dizinlerle ilgili olmadığına inanıyorum (örneğin, '.test'):
require 'find'
Find.find('.') { |e| puts e if File.directory?(e) }
Find.find('/tmp').collect {|_|_}
Bana yardımcı oldu
Dizin listesi için deneyin
Dir['**/']
Dosya listesi daha zordur, çünkü Unix dizini de bir dosyadır, bu nedenle türü test etmeniz veya döndürülen listedeki diğer girdilerin üst öğesi olan girdileri kaldırmanız gerekir.
Dir['**/*'].reject {|fn| File.directory?(fn) }
Ve tüm dosya ve dizinlerin listesi için
Dir['**/*']
Yalnızca dizinler
`find -type d`.split("\n")
Dizinler ve normal dosyalar
`find -type d -or -type f`.split("\n")`
require "pathname"
def rec_path(path, file= false)
puts path
path.children.collect do |child|
if file and child.file?
child
elsif child.directory?
rec_path(child, file) + [child]
end
end.select { |x| x }.flatten(1)
end
# only directories
rec_path(Pathname.new(dir), false)
# directories and normal files
rec_path(Pathname.new(dir), true)
end.select {}.flatten()
kısmı açıklayabilir mi? Genel olarak işlevi beğendim. Bu bir dizi dizisi yaratacak gibi görünüyor? Parçayı şu şekilde yapmak mümkün olabilir miydi elseif
: rec_path(child, file) << child.to_s
Böylece onu bir diziye atayabilir ve bir dizi dizesi elde edebilirsiniz? Teşekkürler!
Buradaki diğer cevaplarda da belirtildiği gibi kullanabilirsiniz Dir.glob
. Klasörlerin içinde birçok garip karakter olabileceğini ve glob argümanlarının kalıp olduğunu, bu nedenle bazı karakterlerin özel anlamları olduğunu unutmayın. Bu nedenle, aşağıdaki gibi bir şey yapmak güvenli değildir:
Dir.glob("#{folder}/**/*")
Bunun yerine şunları yapın:
Dir.chdir(folder) { Dir.glob("**/*").map {|path| File.expand_path(path) } }
PHP veya diğer dillerde bir dizinin içeriğini ve tüm alt dizinlerini almak için bazı satırlar kod yazmanız gerekir, ancak Ruby'de bu 2 satır alır:
require 'find'
Find.find('./') do |f| p f end
bu, geçerli dizinin ve tüm alt dizinlerinin içeriğini yazdıracaktır.
Veya daha kısa, ’**’
gösterimi kullanabilirsiniz :
p Dir['**/*.*']
Aynı sonucu almak için PHP veya Java'da kaç satır yazacaksınız?
Tek satırlık bir çözüm olmasa da, Ruby çağrılarını kullanarak bunu yapmanın en iyi yolu olduğunu düşünüyorum.
Önce tüm dosyaları yinelemeli olarak
silin İkinci olarak tüm boş dizinleri silin
Dir.glob("./logs/**/*").each { |file| File.delete(file) if File.file? file }
Dir.glob("./logs/**/*/").each { |directory| Dir.delete(directory) }
İşte bir Rails proje dizininin dinamik keşfini Dir.glob ile birleştiren bir örnek:
dir = Dir.glob(Rails.root.join('app', 'assets', 'stylesheets', '*'))
config.assets.paths << Rails.root.join("app", "assets", "*")
, ancak yine de varlıklar klasörünün içindeki alt klasörleri ve dosyaları Rails.application.config.assets.paths