ระบบไฟล์ที่กำหนดเองที่มี readdir แฟนซีหรือพฤติกรรมการเสร็จสิ้นการทุบตี


3

ตกลง. หลังจากพยายามตั้งคำถามนี้สองสามครั้งปรากฎว่านี่จะเป็นคำถามที่ยาว Anywho:

พิจารณาโครงสร้างไฟล์นี้:

photos/ 
  ants/ 
    pic1.jpg
  animals/ 
    dog.png
  profile_pic.jpg

ถ้าคุณทำ

cd photos
ls

คุณได้รับ

ants/    animals/    profile_pic.jpg

อย่างไรก็ตามเนื่องจากไดเรกทอรีพักผ่อนและสัตว์มีไฟล์เดียวเท่านั้นแต่ละไฟล์จึงอาจมีประโยชน์มากกว่า

ants/pic1.jpg    ani../dog.png    profile_pic.jpg

ตรงข้ามกับการไปเยี่ยมสัตว์แต่ละตัวและวันหยุดพักผ่อน เมื่อเสร็จสิ้นแท็บเช่นเดียวกับในซีดีคุณจะต้องการคำแนะนำของไดเรกทอรีแทน

ดังนั้นฉันจึงรู้ว่า bash เสร็จแล้วจัดการโดยสคริปต์ / etc / bash_completion (ฉันไม่ต้องการไปที่นั่น) และห้องสมุด readline แต่มันไม่ได้ส่งผลกระทบต่อ ls และแน่นอนไม่ได้ช่วยถ้าคุณต้องการขยายการทำงานเป็นไฟล์ ผู้จัดการเช่นหอยโข่ง ดังนั้นฉันจึงหวังว่าบางสิ่งนี้จะสามารถแก้ไขได้โดยใช้ระบบไฟล์ที่กำหนดเองมากกว่าฟิวส์ การตรวจสอบเบื้องต้นเริ่มจาก บทช่วยสอนนี้ ค่อนข้างหดหู่ แต่เนื่องจากระบบไฟล์ฟิวส์ดูเหมือนจะไม่แตกต่างระหว่างกรณีการใช้งานที่แตกต่างกันของฉัน (readdir, opendir, releaseir ทุกครั้ง)

หากต้องการตั้งคำถาม: ในกรณีที่เป็นไปได้หากไม่มีการแก้ไขที่สำคัญในเคอร์เนล ฉันจะหาข้อมูลเพิ่มเติมได้ที่ไหน

ขอบคุณสำหรับเวลา!

แก้ไข: เพื่อชี้แจงชัดเจนทุบตีเป็นตัวอย่างที่มีประโยชน์ แต่ในที่สุดฉันต้องการให้เหมือนกันผ่าน nautilus และทุกโปรแกรมอื่น ๆ ที่เข้าถึงไฟล์และฉันจะเขียนระบบไฟล์สำหรับปัญหาอื่น ๆ ต่อไป


สิ่งนี้จะทำให้โปรแกรมบางโปรแกรมพัง
BatchyX

มีบางสิ่งที่เหลืออยู่ในพื้นที่ผู้ใช้เช่น ls -R, หรือ find. คุณจะรู้ได้อย่างไรว่าคนอื่นไม่ต้องการที่จะเห็นไดเรกทอรีเท่านั้น?
Keith

@BatchyX คุณถูกต้องแน่นอน จะมีปัญหาแน่นอน
fickludd

@Keith ปัญหาที่ฉันพบคือ FUSE API ดูเหมือนจะไม่สนับสนุนการอ่านชุดย่อยของไดเรกทอรี สิ่งทั้งหมดอ่านได้ตลอดเวลาและโปรแกรมจะดำเนินการกรอง สิ่งนี้มีความแข็งแกร่ง แต่ จำกัด สิ่งที่คุณสามารถทำได้กับระบบไฟล์ที่ใช้ฟิวส์ อย่าพลาด: การออกแบบดีสำหรับการใช้งานที่ตั้งใจ แต่ฉันเกือบจะอยู่นอกการใช้งานนี้ =)
fickludd

คำตอบ:


1

วิธีที่ง่ายที่สุดในการทำสิ่งนี้ให้สำเร็จคือการเขียนสคริปต์ทุบตีเพื่อทำสิ่งนี้ให้คุณ ฉันค่อนข้างแน่ใจว่าคุณจะไม่ต้องการรหัสนี้ใน Kernel หรือระบบแฟ้ม :)

ตรรกะเช่นนี้ควรใช้งานได้:

สืบเชื้อสายมาจากไดเรกทอรี ... ตรวจสอบว่าหนึ่งไฟล์ ... พิมพ์โฟลเดอร์ / ไฟล์ ... อื่นพิมพ์โฟลเดอร์บนสุด


ฉันเห็นสิ่งที่คุณหมายถึง แต่นี่ไม่ใช่ฟังก์ชั่นการใช้งานจริงที่ฉันต้องการเพียงทุบตี แต่ทั่วโลก ชี้แจงคำถามเล็กน้อย
fickludd

1

น่าเสียดายที่ฉันไม่สามารถโพสต์ความคิดเห็นได้ดังนั้นฉันต้องเขียน "คำตอบ" (ฉันยังไม่เข้าใจการตัดสินใจนี้ แต่เพียงพอในการคุยโว) เนื่องจากคุณได้ละทิ้ง bash ตัวเลือกและบอกใบ้ต่อ FUSE วิธีการแก้ปัญหาฉันต้องการที่จะให้คุณสองสามความคิด "มากหรือน้อยทำงานได้" ในขณะที่คุณใช้ของคุณ mp3fs:

  • การเสริมสร้าง struct stat ด้วยรูปแบบใหม่สมมติว่า st_nfiles. ทุกครั้งที่คุณ create()/symlink()/hardlink() ไฟล์คุณจะอัปเดตรายการนี้ในลำดับที่เกี่ยวข้อง FUSE การดำเนินงาน การค้นหาว่ามีเพียงรายการเดียวในไดเรกทอรีที่อ้างอิงจากนั้นจะเป็นเพียงการค้นหาและเปรียบเทียบ (struct stat) dirp->st_nfiles ด้วย 1. คุณจะต้อง LD_PRELOAD ไลบรารีไปยังพื้นที่ผู้ใช้ของคุณที่ไฮแจ็กและขยายที่จำเป็น printf โทรออก stat ผลลัพธ์ด้วยการเปลี่ยนแปลงนี้

  • วัตถุประสงค์ ที่มีอยู่ (struct stat) dirp->st_nlink ในของคุณ FUSE รหัสการดำเนินงานของ getattr(). ข้อเสียเปรียบอาจมีปัญหากับเครื่องมือที่ขึ้นอยู่กับ st_nlink; ถ้าฉันจำได้ถูกต้อง find เป็นหนึ่งในนั้น สิ่งนี้ยังต้องการระดับโลก LD_PRELOAD ห้องสมุดเพื่อซอกับการส่งออก

  • ในการแยกวิเคราะห์ทันที ใน FUSE รหัสการดำเนินงานของ getattr()คล้ายกับสิ่งที่คุณจะทำใน pure userspace นี้ ข้อมูลโค้ดควรให้แนวคิดแก่คุณ

ไม่แน่ใจว่านี่เป็นสิ่งที่คุณต้องการหรือไม่ ฉันหวังว่าฉันจะได้เพิ่มสิ่งนี้เป็นความคิดเห็นมากกว่าคำตอบครึ่งหลัง บางทีคุณอาจต้องการลบ bash แท็กจากคำถามนี้เนื่องจากคุณระบุว่าสิ่งนี้ไม่เหมาะสำหรับคุณเนื่องจากคุณต้องการเครื่องมือเช่น nautilus ทำตัวแบบเดียวกัน


ขอบคุณมากตอนนี้ฉันกำลังเรียนรู้สิ่งต่าง ๆ อีกครั้ง =) จริง ๆ แล้วฉันไม่คุ้นเคยกับ LD_PRELOAD หลอกลวง (ไม่ใช่ผู้ใช้ c บ่อย) แต่นั่นอาจพิสูจน์ได้ว่ามีประโยชน์จริงๆ ในที่สุดปัญหายังคงดูเหมือนว่าเมื่อทำ cd ฉันต้องการไดเรกทอรีจาก readdirแต่เมื่อทำ ls รายการฉันต้องการไฟล์ หากิน!
fickludd
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.