ฉันจะรับรายชื่อโฟลเดอร์ที่มีอยู่ในไดเร็กทอรีที่มีทับทิมได้อย่างไร
Dir.entries()
ดูใกล้ ๆ แต่ไม่รู้จะ จำกัด เฉพาะโฟลเดอร์ได้อย่างไร
ฉันจะรับรายชื่อโฟลเดอร์ที่มีอยู่ในไดเร็กทอรีที่มีทับทิมได้อย่างไร
Dir.entries()
ดูใกล้ ๆ แต่ไม่รู้จะ จำกัด เฉพาะโฟลเดอร์ได้อย่างไร
คำตอบ:
จอร์แดนใกล้ แต่Dir.entries
กลับไม่เต็มเส้นทางที่File.directory?
คาดหวัง ลองสิ่งนี้:
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()
ที่เห็นในคำตอบอื่น ๆ - ฉันขอแนะนำอย่างยิ่งให้ทำเช่นนั้นแทนสิ่งนี้
ฉันพบว่าสิ่งนี้มีประโยชน์และใช้งานง่ายกว่า:
Dir.chdir('/destination_directory')
Dir.glob('*').select {|f| File.directory? f}
ได้รับโฟลเดอร์ทั้งหมดในไดเร็กทอรีปัจจุบันยกเว้น.
และ..
.
ในการเรียกคืนโฟลเดอร์ให้ใช้**
แทน*
ไฟล์.
Dir.glob
สายนอกจากนี้ยังสามารถส่งผ่านไปยังDir.chdir
เป็นบล็อก:
Dir.chdir('/destination directory') do
Dir.glob('*').select { |f| File.directory? f }
end
**/*
แทน*
ไฟล์.
ในความคิดของฉันPathname
เหมาะกับชื่อไฟล์มากกว่าสตริงธรรมดา
require "pathname"
Pathname.new(directory_name).children.select { |c| c.directory? }
สิ่งนี้ทำให้คุณมีอาร์เรย์ของไดเร็กทอรีทั้งหมดในไดเร็กทอรีนั้นเป็นออบเจ็กต์ Pathname
หากคุณต้องการมีสตริง
Pathname.new(directory_name).children.select { |c| c.directory? }.collect { |p| p.to_s }
ถ้าdirectory_name
เป็นค่าสัมบูรณ์สตริงเหล่านี้ก็เป็นค่าสัมบูรณ์เช่นกัน
Pathname
ก็คือว่ามันลบโดยอัตโนมัติ.
, ..
และไฟล์ proprietery เช่น.DS_Store
ค้นหาโฟลเดอร์ทั้งหมดซ้ำ ๆ ภายใต้ไดเรกทอรีบางรายการ:
Dir.glob 'certain_directory/**/*/'
เวอร์ชันที่ไม่เรียกซ้ำ:
Dir.glob 'certain_directory/*/'
หมายเหตุ: Dir.[]
ทำงานเหมือนDir.glob
.
directory = 'Folder'
puts Dir.entries(directory).select { |file| File.directory? File.join(directory, file)}
คุณสามารถใช้File.directory?
จากFileTest
โมดูลเพื่อดูว่าไฟล์เป็นไดเร็กทอรีหรือไม่ การรวมสิ่งนี้เข้ากับDir.entries
make for a nice (ish) -liner:
directory = 'some_dir'
Dir.entries(directory).select { |file| File.directory?(File.join(directory, file)) }
แก้ไข:อัปเดตตามการแก้ไขของ ScottD
กับคนนี้คุณจะได้รับอาร์เรย์ของที่เส้นทางแบบเต็มไปยังไดเรกทอรี , ไดเรกทอรี , subsubdirectoriesในทาง recursive ฉันใช้รหัสนั้นเพื่อโหลดไฟล์เหล่านี้ภายในconfig/application
ไฟล์อย่างกระตือรือร้น
Dir.glob("path/to/your/dir/**/*").select { |entry| File.directory? entry }
นอกจากนี้เราไม่ต้องการจัดการกับสิ่งที่น่าเบื่อ.
และ..
อีกต่อไป คำตอบที่ได้รับการยอมรับจำเป็นสำหรับการจัดการกับพวกเขา
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
สำหรับโซลูชันทั่วไปคุณอาจต้องการใช้
Dir.glob(File.expand_path(path))
ซึ่งจะใช้ได้กับพา ธ เช่น~/*/
(โฟลเดอร์ทั้งหมดในโฮมไดเร็กทอรีของคุณ)
เราสามารถรวมคำตอบของ Borhและคำตอบของjohannesเข้าด้วยกันเพื่อให้ได้วิธีการแก้ปัญหาที่ยอดเยี่ยมในการรับชื่อไดเรกทอรีในโฟลเดอร์
# 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 }
ยกเว้นโฟลเดอร์ ("." และ ".. "):
Dir.glob(File.join(path, "*", File::SEPARATOR))
โฟลเดอร์และไฟล์:
Dir.glob(File.join(path, "*"))
ฉันคิดว่าคุณสามารถทดสอบแต่ละไฟล์เพื่อดูว่าเป็นไดเร็กทอรีที่มีFileTest.directory? (file_name)
ไฟล์. ดูเอกสารสำหรับ FileTestสำหรับข้อมูลเพิ่มเติม
'.'
(ไดเร็กทอรีปัจจุบัน) และ'..'
(พาเรนต์ของไดเร็กทอรีปัจจุบัน) ในกรณีส่วนใหญ่คุณต้องการลบทั้งสองอย่างเป็นอย่างน้อย