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.entriesyolu 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.globHattı da geçirilebilir Dir.chdirbir blok olarak:
Dir.chdir('/destination directory') do
Dir.glob('*').select { |f| File.directory? f }
end
**/*yerine *.
Bana göre Pathnamedosya 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_namemutlak idi, bu dizeleri çok mutlaktır.
Pathnameotomatik 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 FileTestmodülden kullanabilirsiniz . Bunu Dir.entriesgü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/applicationdosyanı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.