วิธีที่เร็วที่สุดและเหมาะสมที่สุดในการรับอาร์เรย์ของไดเร็กทอรี (ไม่รวมไฟล์) ใน Ruby คืออะไร
รวมไฟล์ได้อย่างไร?
วิธีที่เร็วที่สุดและเหมาะสมที่สุดในการรับอาร์เรย์ของไดเร็กทอรี (ไม่รวมไฟล์) ใน Ruby คืออะไร
รวมไฟล์ได้อย่างไร?
คำตอบ:
Dir.glob("**/*/") # for directories
Dir.glob("**/*") # for all files
แทนที่จะDir.glob(foo)
คุณยังสามารถเขียนDir[foo]
( แต่Dir.glob
ยังสามารถใช้บล็อกในกรณีที่มันจะให้ผลผลิตแต่ละเส้นทางแทนการสร้างอาร์เรย์)
Dir.glob("**/")
เว้นแต่คุณต้องการ symlinks ด้วย
File::FNM_DOTMATCH
แฟล็ก
Dir.glob("**/*", File::FNM_DOTMATCH)
ฉันเชื่อว่าไม่มีวิธีแก้ปัญหาใดที่เกี่ยวข้องกับไดเรกทอรีที่ซ่อนอยู่ (เช่น '.test'):
require 'find'
Find.find('.') { |e| puts e if File.directory?(e) }
Find.find('/tmp').collect {|_|_}
เป็นประโยชน์สำหรับฉัน
สำหรับรายชื่อไดเร็กทอรีลอง
Dir['**/']
รายการไฟล์ยากกว่าเนื่องจากในไดเร็กทอรี Unix เป็นไฟล์ด้วยดังนั้นคุณต้องทดสอบประเภทหรือลบรายการจากรายการที่ส่งคืนซึ่งเป็นพาเรนต์ของรายการอื่น
Dir['**/*'].reject {|fn| File.directory?(fn) }
และสำหรับรายชื่อไฟล์และไดเรกทอรีทั้งหมดก็ทำได้ง่ายๆ
Dir['**/*']
ไดเรกทอรีเท่านั้น
`find -type d`.split("\n")
ไดเร็กทอรีและไฟล์ปกติ
`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()
ส่วนนี้? ฉันชอบฟังก์ชั่นโดยรวม ดูเหมือนว่าจะสร้างอาร์เรย์อาร์เรย์? เป็นไปได้ไหมที่จะทำelseif
ส่วนด้วย: rec_path(child, file) << child.to_s
เพื่อให้คุณสามารถกำหนดให้กับอาร์เรย์และรับอาร์เรย์ของสตริงได้ ขอบคุณ!
ดังที่ระบุไว้ในคำตอบอื่น ๆ ที่นี่คุณสามารถDir.glob
ใช้ได้ โปรดทราบว่าโฟลเดอร์อาจมีอักขระแปลก ๆ มากมายอยู่ในโฟลเดอร์และอาร์กิวเมนต์ glob เป็นรูปแบบดังนั้นอักขระบางตัวจึงมีความหมายพิเศษ ดังนั้นจึงไม่ปลอดภัยที่จะทำสิ่งต่อไปนี้:
Dir.glob("#{folder}/**/*")
แทนที่จะทำ:
Dir.chdir(folder) { Dir.glob("**/*").map {|path| File.expand_path(path) } }
ใน PHP หรือภาษาอื่น ๆ เพื่อรับเนื้อหาของไดเร็กทอรีและไดเร็กทอรีย่อยทั้งหมดคุณต้องเขียนโค้ดบางบรรทัด แต่ใน Ruby จะใช้ 2 บรรทัด:
require 'find'
Find.find('./') do |f| p f end
สิ่งนี้จะพิมพ์เนื้อหาของไดเร็กทอรีปัจจุบันและไดเร็กทอรีย่อยทั้งหมด
หรือสั้นกว่านั้นคุณสามารถใช้’**’
สัญกรณ์:
p Dir['**/*.*']
คุณจะเขียน PHP หรือ Java กี่บรรทัดเพื่อให้ได้ผลลัพธ์เดียวกัน
แม้ว่าจะไม่ใช่วิธีแก้ปัญหาแบบบรรทัดเดียว แต่ฉันคิดว่านี่เป็นวิธีที่ดีที่สุดในการใช้การโทรด้วยทับทิม
ขั้นแรกให้ลบไฟล์ทั้งหมดแบบวนซ้ำ
ครั้งที่สองลบไดเร็กทอรีว่างทั้งหมด
Dir.glob("./logs/**/*").each { |file| File.delete(file) if File.file? file }
Dir.glob("./logs/**/*/").each { |directory| Dir.delete(directory) }
นี่คือตัวอย่างที่รวมการค้นพบไดเร็กทอรีโปรเจ็กต์ Rails กับ Dir.glob:
dir = Dir.glob(Rails.root.join('app', 'assets', 'stylesheets', '*'))
config.assets.paths << Rails.root.join("app", "assets", "*")
แต่ยังไม่เห็นโฟลเดอร์ย่อยและไฟล์ในโฟลเดอร์ assets โดยRails.application.config.assets.paths
Dir.open(Dir.pwd).map { |h| (File.file?(h) ? "#{h} - file" : "#{h} - folder") if h[0] != '.' }
จุดกลับศูนย์ใช้ขนาดกะทัดรัด