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.entries
tidak 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.glob
garis juga dapat dikirimkan ke Dir.chdir
sebagai blok:
Dir.chdir('/destination directory') do
Dir.glob('*').select { |f| File.directory? f }
end
**/*
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.
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 seperti Dir.glob
.
Anda dapat menggunakan File.directory?
dari FileTest
modul untuk mengetahui apakah file adalah direktori. Menggabungkan ini dengan Dir.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.
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.
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.