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.
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.
Jawaban:
Jordan sudah dekat, tetapi Dir.entriestidak kembali ke jalur penuh yang File.directory?diharapkan. Coba ini:
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()terlihat pada jawaban lain - Saya sangat menyarankan untuk melakukan itu saja daripada ini
Menurut 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.globgaris juga dapat dikirimkan ke Dir.chdirsebagai blok:
Dir.chdir('/destination directory') do
Dir.glob('*').select { |f| File.directory? f }
end
**/*sebagai pengganti *.
Menurut pendapat saya Pathnamejauh 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_namemutlak, string ini juga mutlak.
Pathnameadalah 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 seperti Dir.glob.
Anda dapat menggunakan File.directory?dari FileTestmodul untuk mengetahui apakah file adalah direktori. Menggabungkan ini dengan Dir.entriesmake untuk yang bagus (ish) -liner:
directory = 'some_dir'
Dir.entries(directory).select { |file| File.directory?(File.join(directory, file)) }
Edit: Diperbarui per koreksi ScottD.
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/applicationfile.
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.
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
Untuk solusi umum yang mungkin ingin Anda gunakan
Dir.glob(File.expand_path(path))
Ini akan bekerja dengan jalur seperti ~/*/(semua folder dalam direktori home Anda).
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 }
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.
'.'(direktori saat ini) dan'..'(induk direktori saat ini). Dalam kebanyakan kasus, Anda ingin menghapus setidaknya keduanya.