File System Priority Queue (FSPQ)

לאחרונה כתבתי תכנה שקוראת מספר גדול של קבצים ומבצעת עליהם פעולות שונות, במהלך הפיתוח רציתי לממש "תור עדיפות" על מנת ליעל את פעילות התכנה.

תור עדיפות (Priority Queue) הוא מבנה נתונים פשוט שמכיל רשימה של עצמים אשר מסודרים לפי עדיפות כלשהי. לדוגמה אם יש לי רשימה של ספרים, שבה כל ספר מקבל דירוג של 1-5 כוכבים ואני רוצה שהספרים בעלי הדירוג הגבוה יותר יופיעו ראשונים, דרך אחת לפתור את הבעיה היא לשמור אותם ב - Priority Queue. המימוש הפשוט הוא רשימה מקושרת שמחזיקה את רשימת הקבצים מסודרים לפי סדר העדיפויות שלהם. בגלל שהקוד שלי נכתב על מערכת מבוססת Unix, היה לי רעיון אחר: למה לא ליצור File System Priority Queue?

במערכת מבוססות Unix, כאשר אתם מריצים את הפקודה ls(1) או - find(1) הקבצים שיוצגו לכם יהיו מסודרים בסדר אלפבתי. זה מאפשר לנו לעשות דברים מעניינים כמו יצירת תור עדיפות!

כך ניצור את התור: נניח שיש לי תקייה מלאה בקבצים, ואני רוצה להקצות לכל קובץ עדיפות. לצורך הדוגמה קבצים בעלי עדיפות "0" יהיו בעלי עדיפות גבוה, "1" עדיפות רגילה ו - "2" עדיפות נמוכה. במקרה הזה אני יצור עבור כל עדיפות תקיה:

$ mkdir files/{0,1,2}

לאחר מכן אני יעביר (או יקשר) את הקבצים בעלי ההעדיפות הגבוהה ל - "0", רגילה ל - "1" ונמוכה ל - "2":

$ mv  files/file.txt files/file2.txt files/0
$ mv  files/file3.txt files/file4.txt files/1
$ mv  files/file5.txt files/file6.txt files/2

זהו! עכשיו כשאני יריץ find(1) על תקיית הקבצים הם יוצגו לי לפי סדר עדיפות:

$ find ./files/ -type f
/files/0/file1.txt
./files/0/file2.txt
./files/0/file4.txt
./files/1/file10.txt
./files/1/file3.txt
./files/1/file5.txt
./files/1/file6.txt
./files/2/file7.txt
./files/2/file8.txt
./files/2/file9.txt

השמות של התקיות לא חייבים להיות "0", "1" או "2", הם יכולים להיות:

לדוגמה:

$ find ./files/ -type f
./files/high/file1.txt
./files/high/file2.txt
./files/high/file4.txt
./files/low/file7.txt
./files/low/file8.txt
./files/low/file9.txt

פתרון פשוט ואלגנטי.