Cách nhanh nhất, tối ưu nhất, một lớp để lấy một mảng thư mục (không bao gồm tệp) trong Ruby là gì?
Làm thế nào về bao gồm các tệp?
Cách nhanh nhất, tối ưu nhất, một lớp để lấy một mảng thư mục (không bao gồm tệp) trong Ruby là gì?
Làm thế nào về bao gồm các tệp?
Câu trả lời:
Dir.glob("**/*/") # for directories
Dir.glob("**/*") # for all files
Thay vào đó, Dir.glob(foo)
bạn cũng có thể viết Dir[foo]
(tuy nhiên Dir.glob
cũng có thể lấy một khối, trong trường hợp đó, nó sẽ mang lại mỗi đường dẫn thay vì tạo một mảng).
Dir.glob("**/")
trừ khi bạn cũng muốn liên kết tượng trưng
File::FNM_DOTMATCH
cờ.
Dir.glob("**/*", File::FNM_DOTMATCH)
Tôi tin rằng không có giải pháp nào ở đây giải quyết các thư mục ẩn (ví dụ: '.test'):
require 'find'
Find.find('.') { |e| puts e if File.directory?(e) }
Find.find('/tmp').collect {|_|_}
Là hữu ích đối với tôi
Để biết danh sách thư mục, hãy thử
Dir['**/']
Danh sách tệp khó hơn, vì trong thư mục Unix cũng là tệp, vì vậy bạn cần kiểm tra loại hoặc loại bỏ các mục từ danh sách trả về là cha của các mục khác.
Dir['**/*'].reject {|fn| File.directory?(fn) }
Và để có danh sách tất cả các tệp và thư mục, chỉ cần
Dir['**/*']
Chỉ các thư mục
`find -type d`.split("\n")
Thư mục và tệp bình thường
`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()
một phần? Tôi thích chức năng tổng thể. Có vẻ như sẽ tạo ra một mảng mảng? Có thể thực hiện elseif
phần với: rec_path(child, file) << child.to_s
để bạn có thể gán nó vào một mảng và nhận một mảng chuỗi không? Cảm ơn!
Như đã lưu ý trong các câu trả lời khác ở đây, bạn có thể sử dụng Dir.glob
. Hãy nhớ rằng các thư mục có thể có nhiều ký tự lạ trong đó và đối số hình cầu là các mẫu, vì vậy một số ký tự có ý nghĩa đặc biệt. Do đó, sẽ không an toàn khi làm những điều như sau:
Dir.glob("#{folder}/**/*")
Thay vào đó hãy làm:
Dir.chdir(folder) { Dir.glob("**/*").map {|path| File.expand_path(path) } }
Trong PHP hoặc các ngôn ngữ khác để lấy nội dung của một thư mục và tất cả các thư mục con của nó, bạn phải viết một số dòng mã, nhưng trong Ruby thì phải mất 2 dòng:
require 'find'
Find.find('./') do |f| p f end
điều này sẽ in nội dung của thư mục hiện tại và tất cả các thư mục con của nó.
Hoặc ngắn hơn, Bạn có thể sử dụng ’**’
ký hiệu:
p Dir['**/*.*']
Bạn sẽ viết bao nhiêu dòng bằng PHP hoặc bằng Java để nhận được cùng một kết quả?
Mặc dù không phải là giải pháp một dòng, nhưng tôi nghĩ đây là cách tốt nhất để thực hiện bằng cách gọi ruby.
Đầu tiên xóa tất cả các tệp một cách đệ quy
Thứ hai xóa tất cả các thư mục trống
Dir.glob("./logs/**/*").each { |file| File.delete(file) if File.file? file }
Dir.glob("./logs/**/*/").each { |directory| Dir.delete(directory) }
Dưới đây là một ví dụ kết hợp tính năng khám phá động của thư mục dự án Rails với Dir.glob:
dir = Dir.glob(Rails.root.join('app', 'assets', 'stylesheets', '*'))
config.assets.paths << Rails.root.join("app", "assets", "*")
, nhưng vẫn không thể nhìn thấy các thư mục con và các tập tin bên trong thư mục tài sản doRails.application.config.assets.paths