Bagaimana cara mendapatkan daftar folder yang ada di direktori tertentu dengan ruby?
Dir.entries()
terlihat dekat tetapi saya tidak tahu cara membatasi ke folder saja.
ruby
directory
directory-listing
0xC0DEFACE
sumber
sumber
'.'
(direktori saat ini) dan'..'
(induk direktori saat ini). Dalam kebanyakan kasus, Anda ingin menghapus setidaknya keduanya.Dir.entries(root).select { |entry| File.directory? File.join(root, entry) and not entry.in? %w[. ..]}
Dir.glob
.Dir.glob()
terlihat pada jawaban lain - Saya sangat menyarankan untuk melakukan itu saja daripada iniMenurut saya ini lebih berguna dan mudah digunakan:
Dir.chdir('/destination_directory') Dir.glob('*').select {|f| File.directory? f}
itu mendapat semua folder di direktori saat ini, dikecualikan
.
dan..
.Untuk mengulang folder, cukup gunakan
**
sebagai pengganti*
.The
Dir.glob
garis juga dapat dikirimkan keDir.chdir
sebagai blok:Dir.chdir('/destination directory') do Dir.glob('*').select { |f| File.directory? f } end
sumber
**/*
sebagai pengganti*
.Menurut pendapat saya
Pathname
jauh lebih cocok untuk nama file daripada string biasa.require "pathname" Pathname.new(directory_name).children.select { |c| c.directory? }
Ini memberi Anda larik semua direktori di direktori itu sebagai objek Pathname.
Jika Anda ingin memiliki string
Pathname.new(directory_name).children.select { |c| c.directory? }.collect { |p| p.to_s }
Jika
directory_name
mutlak, string ini juga mutlak.sumber
Pathname
adalah bahwa secara otomatis menghapus.
,..
dan file kepemilikan seperti.DS_Store
Temukan semua folder di bawah direktori tertentu secara rekursif:
Dir.glob 'certain_directory/**/*/'
Versi non-rekursif:
Dir.glob 'certain_directory/*/'
Catatan:
Dir.[]
berfungsi sepertiDir.glob
.sumber
directory = 'Folder' puts Dir.entries(directory).select { |file| File.directory? File.join(directory, file)}
sumber
Anda dapat menggunakan
File.directory?
dariFileTest
modul untuk mengetahui apakah file adalah direktori. Menggabungkan ini denganDir.entries
make untuk yang bagus (ish) -liner:directory = 'some_dir' Dir.entries(directory).select { |file| File.directory?(File.join(directory, file)) }
Edit: Diperbarui per koreksi ScottD.
sumber
Dengan yang satu ini, Anda bisa mendapatkan array dari path lengkap untuk Anda direktori , subdirektori , subsubdirectories dengan cara rekursif. Saya menggunakan kode itu untuk memuat file-file ini di dalam
config/application
file.Dir.glob("path/to/your/dir/**/*").select { |entry| File.directory? entry }
Selain itu kita tidak perlu berurusan dengan yang membosankan
.
dan..
lagi. Jawaban yang diterima perlu berurusan dengan mereka.sumber
Dir.glob('/your_dir').reject {|e| !File.directory?(e)}
sumber
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
sumber
Untuk solusi umum yang mungkin ingin Anda gunakan
Ini akan bekerja dengan jalur seperti
~/*/
(semua folder dalam direktori home Anda).sumber
Kita dapat menggabungkan jawaban Borh dan jawaban johannes untuk mendapatkan solusi yang cukup elegan untuk mendapatkan nama direktori dalam sebuah folder.
# 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 }
sumber
Hanya folder ('.' Dan '..' yang dikecualikan):
Dir.glob(File.join(path, "*", File::SEPARATOR))
Folder dan file:
Dir.glob(File.join(path, "*"))
sumber
Saya rasa Anda dapat menguji setiap file untuk melihat apakah itu adalah direktori dengan
FileTest.directory? (file_name)
. Lihat dokumentasi FileTest untuk info lebih lanjut.sumber