Apa cara tercepat, paling optimal, satu-liner untuk mendapatkan array direktori (tidak termasuk file) di Ruby?
Bagaimana dengan menyertakan file?
Apa cara tercepat, paling optimal, satu-liner untuk mendapatkan array direktori (tidak termasuk file) di Ruby?
Bagaimana dengan menyertakan file?
Jawaban:
Dir.glob("**/*/") # for directories
Dir.glob("**/*") # for all files
Selain Dir.glob(foo)
Anda juga dapat menulis Dir[foo]
(namun Dir.glob
juga dapat mengambil blok, dalam hal ini akan menghasilkan setiap jalur alih-alih membuat larik).
Dir.glob("**/")
kecuali Anda juga ingin symlinks
File::FNM_DOTMATCH
bendera.
Dir.glob("**/*", File::FNM_DOTMATCH)
Saya yakin tidak ada solusi di sini yang berhubungan dengan direktori tersembunyi (misalnya '.test'):
require 'find'
Find.find('.') { |e| puts e if File.directory?(e) }
Find.find('/tmp').collect {|_|_}
Sangat membantu bagi saya
Untuk daftar direktori coba
Dir['**/']
Daftar file lebih sulit, karena di direktori Unix juga ada file, jadi Anda perlu menguji jenis atau menghapus entri dari daftar yang dikembalikan yang merupakan induk dari entri lain.
Dir['**/*'].reject {|fn| File.directory?(fn) }
Dan untuk daftar semua file dan direktori secara sederhana
Dir['**/*']
Hanya direktori
`find -type d`.split("\n")
Direktori dan file normal
`find -type d -or -type f`.split("\n")`
require "pathname"
def rec_path(path, file= false)
puts path
path.children.collect do |child|
if file and child.file?
child
elsif child.directory?
rec_path(child, file) + [child]
end
end.select { |x| x }.flatten(1)
end
# only directories
rec_path(Pathname.new(dir), false)
# directories and normal files
rec_path(Pathname.new(dir), true)
end.select {}.flatten()
bagian itu? Saya suka fungsinya secara keseluruhan. Sepertinya itu akan membuat array array? Apakah mungkin untuk melakukan elseif
bagian tersebut dengan: rec_path(child, file) << child.to_s
sehingga Anda bisa menugaskannya ke sebuah array dan mendapatkan sebuah array string? Terima kasih!
Seperti yang disebutkan dalam jawaban lain di sini, Anda dapat menggunakan Dir.glob
. Perlu diingat bahwa folder dapat memiliki banyak karakter aneh di dalamnya, dan argumen glob adalah pola, jadi beberapa karakter memiliki arti khusus. Karena itu, tidak aman untuk melakukan sesuatu seperti berikut ini:
Dir.glob("#{folder}/**/*")
Sebaliknya lakukan:
Dir.chdir(folder) { Dir.glob("**/*").map {|path| File.expand_path(path) } }
Di PHP atau bahasa lain untuk mendapatkan konten dari sebuah direktori dan semua subdirektorinya, Anda harus menulis beberapa baris kode, tetapi di Ruby dibutuhkan 2 baris:
require 'find'
Find.find('./') do |f| p f end
ini akan mencetak konten dari direktori saat ini dan semua subdirektorinya.
Atau lebih pendek, Anda dapat menggunakan ’**’
notasi:
p Dir['**/*.*']
Berapa banyak baris yang akan Anda tulis dalam PHP atau Java untuk mendapatkan hasil yang sama?
Meskipun bukan solusi satu baris, saya rasa ini adalah cara terbaik untuk melakukannya menggunakan panggilan ruby.
Pertama hapus semua file secara rekursif
Kedua hapus semua direktori kosong
Dir.glob("./logs/**/*").each { |file| File.delete(file) if File.file? file }
Dir.glob("./logs/**/*/").each { |directory| Dir.delete(directory) }
Berikut adalah contoh yang menggabungkan penemuan dinamis dari direktori proyek Rails dengan Dir.glob:
dir = Dir.glob(Rails.root.join('app', 'assets', 'stylesheets', '*'))
config.assets.paths << Rails.root.join("app", "assets", "*")
, tetapi masih tidak dapat melihat sub-folder dan file di dalam folder aset olehRails.application.config.assets.paths