Ruby ile belirli bir dizinde bulunan klasörlerin bir listesini nasıl alabilirim?
Dir.entries()
yakın görünüyor, ancak yalnızca klasörlerle nasıl sınırlandırılacağını bilmiyorum.
Ruby ile belirli bir dizinde bulunan klasörlerin bir listesini nasıl alabilirim?
Dir.entries()
yakın görünüyor, ancak yalnızca klasörlerle nasıl sınırlandırılacağını bilmiyorum.
Yanıtlar:
Ürdün yakındır, ancak beklenen Dir.entries
yolu tam olarak geri vermez File.directory?
. Bunu dene:
Dir.entries('/your_dir').select {|entry| File.directory? File.join('/your_dir',entry) and !(entry =='.' || entry == '..') }
Dir.entries(root).select { |entry| File.directory? File.join(root, entry) and not entry.in? %w[. ..]}
Dir.glob
.
Dir.glob()
olarak diğer cevapta görüldüğünden daha kötü - bunun yerine sadece bunu yapmanızı şiddetle tavsiye ederim
Bunu daha kullanışlı ve kullanımı kolay buldum:
Dir.chdir('/destination_directory')
Dir.glob('*').select {|f| File.directory? f}
geçerli dizindeki tüm klasörleri alır, hariç tutulur .
ve ..
.
Klasörleri yinelemek için **
yerine kullanın *
.
Dir.glob
Hattı da geçirilebilir Dir.chdir
bir blok olarak:
Dir.chdir('/destination directory') do
Dir.glob('*').select { |f| File.directory? f }
end
**/*
yerine *
.
Bana göre Pathname
dosya adları için düz dizelerden çok daha uygun.
require "pathname"
Pathname.new(directory_name).children.select { |c| c.directory? }
Bu size o dizindeki tüm dizinlerin bir Dizisini Yol adı nesneleri olarak verir.
Eğer dizelere sahip olmak istiyorsan
Pathname.new(directory_name).children.select { |c| c.directory? }.collect { |p| p.to_s }
Eğer directory_name
mutlak idi, bu dizeleri çok mutlaktır.
Pathname
otomatik kaldırır olmasıdır .
, ..
benzeri ve proprietery dosyaları.DS_Store
Belirli bir dizin altındaki tüm klasörleri yinelemeli olarak bulun:
Dir.glob 'certain_directory/**/*/'
Yinelemeli olmayan sürüm:
Dir.glob 'certain_directory/*/'
Not: Dir.[]
gibi çalışır Dir.glob
.
Bir dosyanın bir dizin olup olmadığını öğrenmek File.directory?
için FileTest
modülden kullanabilirsiniz . Bunu Dir.entries
güzel bir (ish) -liner ile birleştirmek:
directory = 'some_dir'
Dir.entries(directory).select { |file| File.directory?(File.join(directory, file)) }
Düzenleme: ScottD'nin düzeltmesine göre güncellendi.
Bu bir ile, bir dizi alabilirsiniz tam yol sizin için dizinleri , alt dizinleri , subsubdirectories bir özyinelemeli bir şekilde. Bu kodu, bu dosyaları config/application
dosyanın içine yüklemek için kullandım .
Dir.glob("path/to/your/dir/**/*").select { |entry| File.directory? entry }
Ayrıca sıkıcı .
ve ..
artık uğraşmamıza gerek yok. Kabul edilen cevabın onlarla başa çıkması gerekiyordu.
Dir.glob('/your_dir').reject {|e| !File.directory?(e)}
reject !
,select
$dir_target = "/Users/david/Movies/Camtasia 2/AzureMobileServices.cmproj/media"
Dir.glob("#{$dir_target}/**/*").each do |f|
if File.directory?(f)
puts "#{f}\n"
end
end
Genel bir çözüm için muhtemelen kullanmak isteyeceksiniz
Dir.glob(File.expand_path(path))
Bu, ~/*/
(ana dizininizdeki tüm klasörler) gibi yollarla çalışacaktır .
Biz birleştirebilirsiniz Borh yanıtını ve johannes' cevabını bir klasörde dizin adları almak için oldukça şık bir çözüm elde etmek.
# user globbing to get a list of directories for a path
base_dir_path = ''
directory_paths = Dir.glob(File.join(base_dir_path, '*', ''))
# or recursive version:
directory_paths = Dir.glob(File.join(base_dir_path, '**', '*', ''))
# cast to Pathname
directories = directory_paths.collect {|path| Pathname.new(path) }
# return the basename of the directories
directory_names = directories.collect {|dir| dir.basename.to_s }
Bir dizin olup olmadığını görmek için her dosyayı test edebileceğinizi düşünüyorum FileTest.directory? (file_name)
. Daha fazla bilgi için FileTest belgelerine bakın .
'.'
(geçerli dizin) ve'..'
(geçerli dizinin üst öğesi) de alacağını unutmayın . Çoğu durumda, en azından bu ikisini kaldırmak istersiniz.