Làm cách nào để lấy danh sách các thư mục tồn tại trong một thư mục nhất định bằng ruby?
Dir.entries()
nhìn gần nhưng tôi không biết làm thế nào để chỉ giới hạn trong các thư mục.
Làm cách nào để lấy danh sách các thư mục tồn tại trong một thư mục nhất định bằng ruby?
Dir.entries()
nhìn gần nhưng tôi không biết làm thế nào để chỉ giới hạn trong các thư mục.
Câu trả lời:
Jordan đã gần, nhưng Dir.entries
không trở lại con đường đầy đủ như File.directory?
mong đợi. Thử cái này:
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()
như đã thấy trong các câu trả lời khác - Tôi rất muốn khuyên bạn nên chỉ làm điều đó thay vì điều này
Tôi thấy điều này hữu ích và dễ sử dụng hơn:
Dir.chdir('/destination_directory')
Dir.glob('*').select {|f| File.directory? f}
nó nhận tất cả các thư mục trong thư mục hiện tại, loại trừ .
và ..
.
Để đệ quy các thư mục chỉ cần sử dụng **
thay thế *
.
Các Dir.glob
dòng cũng có thể được chuyển tới Dir.chdir
như một khối:
Dir.chdir('/destination directory') do
Dir.glob('*').select { |f| File.directory? f }
end
**/*
thay thế cho *
.
Theo ý kiến của tôi, Pathname
tên tệp phù hợp hơn nhiều so với chuỗi đơn giản.
require "pathname"
Pathname.new(directory_name).children.select { |c| c.directory? }
Điều này cung cấp cho bạn một mảng tất cả các thư mục trong thư mục đó dưới dạng các đối tượng Pathname.
Nếu bạn muốn có chuỗi
Pathname.new(directory_name).children.select { |c| c.directory? }.collect { |p| p.to_s }
Nếu directory_name
là tuyệt đối, các chuỗi này cũng là tuyệt đối.
Pathname
là nó tự động loại bỏ .
, ..
và các tập tin proprietery như.DS_Store
Tìm đệ quy tất cả các thư mục trong một thư mục nhất định:
Dir.glob 'certain_directory/**/*/'
Phiên bản không đệ quy:
Dir.glob 'certain_directory/*/'
Lưu ý: Dir.[]
hoạt động như thế nào Dir.glob
.
Bạn có thể sử dụng File.directory?
từ FileTest
mô-đun để tìm xem tệp có phải là một thư mục hay không. Kết hợp cái này với Dir.entries
tạo ra một cái đẹp (ish) -liner:
directory = 'some_dir'
Dir.entries(directory).select { |file| File.directory?(File.join(directory, file)) }
Chỉnh sửa: Đã cập nhật mỗi lần chỉnh sửa của ScottD.
Với thế này, bạn có thể nhận được các mảng của một đường dẫn đầy đủ để bạn thư mục , thư mục con , subsubdirectories một cách đệ quy. Tôi đã sử dụng mã đó để tải các tệp này vào bên trong config/application
tệp.
Dir.glob("path/to/your/dir/**/*").select { |entry| File.directory? entry }
Ngoài ra, chúng ta không cần phải đối phó với sự nhàm chán .
và ..
nữa. Câu trả lời được chấp nhận cần thiết để đối phó với chúng.
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
Đối với một giải pháp chung, bạn có thể muốn sử dụng
Dir.glob(File.expand_path(path))
Điều này sẽ hoạt động với các đường dẫn như ~/*/
(tất cả các thư mục trong thư mục chính của bạn).
Chúng ta có thể kết hợp câu trả lời của Borh và câu trả lời của johannes để có được một giải pháp khá hữu ích để lấy tên thư mục trong một thư mục.
# 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 }
Tôi nghĩ bạn có thể kiểm tra từng tệp để xem nó có phải là một thư mục với FileTest.directory? (file_name)
. Xem tài liệu về FileTest để biết thêm thông tin.
'.'
(thư mục hiện tại) và'..'
(thư mục mẹ của thư mục hiện tại). Trong hầu hết các trường hợp, bạn muốn loại bỏ ít nhất hai điều đó.