ปฏิบัติการครั้งที่ 3 - ระบบแฟ้ม (ตอนที่ ๒) คำชี้แจง --------- ปฏิบัติการครั้งนี้เป็นเรื่องสืบเนื่องมาจากปฏิบัติการครั้งที่ ๒ หมายความว่าการทำงานของปฏิบัติการครั้งที่แล้ว ต้องเรียบร้อยสมบูรณ์แล้ว จึงจะทำงานครั้งนี้ได้ โครงสร้าง directory และแฟ้มที่สร้างขึ้นตามปฏิบัติการที่ ๒ เป็นดังนี้ - สิทธิในการใช้งาน "แฟ้ม" แต่ละระดับกำหนดไว้ในวงเล็บ 886326 | +-----------------+---------------------------------------+-----------+-----------+---------+---------+ | | | | | | H K xx.txt yy.txt xy.txt xz.txt | | +---------+-----------+---------+---------+---------+ +---------+---------+ | | | | | | | | | A B C D E xx.txt F G yy.txt (rw- rw- r--) | | | | | | | xx.txt yy.txt xx.txt xx.txt yy.txt xx.txt yy.txt yy.txt (r-- --- ---) (rw- r-- ---) ตอนที่ ๑ Wildcard ในชื่อแฟ้ม -------------------------------- กำหนดให้ไดเรกทอรีปัจจุบันอยู่ที่ ~/886326 คำสั่งสองคำสั่งต่อไปนี้คือ $ rm x?.txt $ rm x[yz].txt มีการทำงานเหมือนกันหรือไม่? แตกต่างกันอย่างไร? ให้ทำการเลือกคำสั่งที่กำหนดมาให้ ทำการลบแฟ้ม xy.txt และ xz.txt ตอนที่ ๒ การเปลี่ยนชื่อแฟ้ม ------------------------------ การเปลี่ยนชื่อแฟ้มในระบบปฏิบัติการ Unix ใช้คำสั่ง mv (move) mv - move (rename) files คำสั่ง mv ใช้งานได้หลายแบบ ได้แก่ การเปลี่ยนชื่อแฟ้ม ย้ายแฟ้มจากไดเรกทอรีหนึ่งไปยังอีกไดเรกทอรีหนึ่ง ซึ่งสามารถกำหนดได้ว่า จะคงชื่อเดิมไว้ หรือเปลี่ยนชื่อใหม่ คำสั่งนี้ใช้งานได้ทั้งแฟ้มและไดเรกทอรี รูปแบบที่ ๑ การเปลี่ยนชื่อแฟ้ม หรือชื่อไดเรกทอรี ---------------------------------------------------- $ mv <ชื่อเดิม> <ชื่อใหม่> ตัวอย่าง --------- กำหนดให้ไดเรกทอรีปัจจุบันเป็น ~/886326 และต้องการเปลี่ยนชื่อแฟ้ม xx.txt เป็น memo1.txt ทำได้ดังนี้ $ mv xx.txt memo1.txt คำสั่งนี้ทำการเปลี่ยนเฉพาะชื่อแฟ้ม ส่วนข้อมูลในแฟ้มยังคงเหมือนเดิม ระบบปฏิบัติการ Unix มีแนวคิดที่สำคัญคือ "No news is good news." หรือ "ไม่มีข่าวเป็นข่าวดี" กล่าวคือหากคำสั่งถูกต้องดำเนินการ ได้ ระบบจะทำงานตามคำสั่งนั้น เสร็จแล้วจะแสดง Prompt เพื่อรอรับคำสั่งต่อไปจากผู้ใช้ ดังนั้นเมื่อมีการใช้คำสั่งทุกครั้ง หากระบบ แสดงข่าวสารแสดงว่าคำสั่งผิดหรือมีความผิดพลาดเกิดขึ้น ระบบปฏิบัติการไม่สามารถดำเนินการตามคำสั่งนั้นได้ ผู้ใช้ขึงต้องอ่านและ ทำความเข้าใจข่าวสารนั้นเพื่อใช้เป็นแนวทางในการแก้ไขคำสั่งหรือการทำงานนั้นให้ถูกต้อง ในกรณีที่ระบบสามารถดำเนินการได้เรียบ ร้อย ผู้ใช้ที่เริ่มใช้งานใหม่หรือยังมีประสบการณ์ไม่มาก ควรตรวจสอบผลการทำงานของคำสั่งโดยใช้คำสั่งที่สอดคล้องกัน เช่น หากใช้ คำสั่ง mv ในการเปลี่ยนชื่อ ควรตรวจสอบด้วยคำสั่ง ls, คำสั่ง cd ควรตรวจสอบด้วยคำสั่ง pwd, หรือคำสั่ง chmod ควรตรวจสอบด้วย คำสั่ง ls -l เป็นต้น คำถาม ------- หากต้องการตรวจสอบว่า คำสั่ง mv เปลี่ยนเฉพาะชื่อแฟ้ม แต่ข้อมูลในแฟ้มยังคงเดิม ควรจะต้องตรวจสอบอย่างไร? แบบฝึกหัด ----------- จงเปลี่ยนชื่อแฟ้ม yy.txt ในไดเรกทอรี 886326 (~/886326/yy.txt) เป็น memo2.txt รูปแบบที่ ๒ การย้ายแฟ้มหรือไดเรกทอรีจากจุดหนึ่งไปยังอีกจุดหนึ่งในระบบแฟ้ม ------------------------------------------------------------------------------------- $ mv <ชื่อแฟ้มหรือไดเรกทอรีที่ต้องการย้าย> <ไดเรกทอรีปลายทาง> ตัวอย่าง --------- กำหนดให้ไดเรกทอรีปัจจุบันเป็น ~/886326/H และต้องการย้ายตำแหน่งแฟ้ม xx.txt ให้ไปอยู่ใน ~/886326 ซึ่งเป็น parent directory ทำได้ดังนี้ (1) แฟ้มที่ต้องการย้ายคือ ~/886326/H/xx.txt แต่เนื่องจาก ~/886326/H เป็นไดเรกทอรีปัจจุบันจึงสามารถใช้ชื่อแฟ้มได้โดยตรง หรือจะกำหนดเป็น ./xx.txt ก็ได้ ดังนั้นจึงสามารถใช้ชื่อแฟ้มที่ต้องการย้ายได้ 3 แบบคือ (ก) ~/886326/H/xx.txt (ข) ./xx.txt (ค) xx.txt (2) ไดเรกทอรีปลายทางคือ ~/886326 ซึ่งเป็น parent directory ซึ่งสามารถกำหนดได้ด้วยชื่อเส้นทาง ~/886326 หรือใช้ .. ซึ่งเป็นสัญลักษณ์แทน parent directory ก็ได้ (ก) ~/886326 (ข) .. (3) เนื่องจาก <ชื่อแฟ้มหรือไดเรกทอรีที่ต้องการย้าย> สามารถใช้ได้ 3 แบบ และ <ไดเรกทอรีปลายทาง> สามารถใช้ได้ 2 แบบ จึงสามารถจัดบรรทัดคำสั่งของ mv ที่สามารถใช้งานได้ 3 x 2 = 6 แบบที่ไม่ซ้ำกัน คือ (ก) mv ~/886326/H/xx.txt ~/886326 # สามารถใช้งานได้ทุกจุดไม่ว่าจะอยู่ที่ใดในระบบแฟ้ม (ข) mv ~/886326/H/xx.txt .. (ค) mv ./xx.txt ~/886326 (ง) mv ./xx.txt .. (จ) mv xx.txt ~/886326 (ฉ) mv xx.txt .. # รูปแบบที่สั้นที่สุด และนิยมใช้มากที่สุด คำถาม ------- เมื่อทำการย้ายแฟ้มไปแล้ว จะรู้ได้อย่างไรว่าผลการทำงานถูกต้อง นั่นคือ - จะต้องใช้คำสั่งใดจึงจะรู้ว่า "ไม่มี" แฟ้ม xx.txt อยู่ในไดเรกทอรีเดิมอีก?, และ - จะต้องใช้คำสั่งใดจึงจะรู้ว่า "มี" แฟ้ม xx.txt เพิ่มขึ้นไดเรกทอรีใหม่? แบบฝึกหัด ----------- - กำหนดให้ไดเรกทอรีปัจจุบันเป็น ~/886326/H ให้ทำการย้ายแฟ้ม ~/886326/H/C/yy.txt ให้ไปอยู่ใน ~/886326 - ก่อนทำการย้าย ให้ให้ใช้คำสั่ง ls -l ตรวจสอบสิทธิในการใช้งานแฟ้ม yy.txt และเมื่อเมื่อทำการย้ายเรียบร้อยแล้ว ให้ใช้คำสั่ง ls -l ตรวจ สอบสิทธิในการใช้งานแฟ้มอีกครั้งหนึ่ง สิทธิในการใช้งานแฟ้ม yy.txt เปลี่ยนแปลงไปจากเดิมหรือไม่? อย่างไร? และจะสรุปว่าอย่างไร? สรุป --- โครงสร้างไดเรกทอรีและแฟ้ม ณ จุดนี้ ควรเป็นดังนี้ 886326 | +-----------------+--------------------------+-----------+--------------+-----------+ | | | | | H K memo1.txt memo2.txt yy.txt | | +---------+-----------+---------+---------+ +---------+---------+ | | | | | | | | A B C D E F G yy.txt (rw- rw- ---) | | | | | | | xx.txt yy.txt xx.txt xx.txt yy.txt xx.txt yy.txt (rw- r-- ---) (r-- --- ---) ตรวจสอบให้ถูกต้องก่อนทำงานต่อไป แบบฝึกหัด ----------- 1. ให้ทำการเปลี่ยนชื่อแฟ้มในไดเรกทอรี A, B, C, D, และ E โดยเปลี่ยนชื่อแฟ้มให้เป็นไปตามชื่อไดเรกทอรี เช่น แฟ้ม xx.txt ใน ~/885326/H/A ให้เปลี่ยนชื่อเป็น aa.txt, แฟ้ม yy.txt ใน ~/885326/H/B เปลี่ยนชื่อเป็น bb.txt} ... 2. เมื่อดำเนินการตามข้อ (1) เสร็จแล้ว ให้ย้ายแฟ้ม aa.txt, bb.txt, dd.txt และ ee.txt มารวมกันไว้ในไดเรกทอรี C 3. เขียนแผนภาพแสดงโครงสร้างไดเรกทอรีใหม่ ให้สอดคล้องกับความเป็นจริง แผนภาพนี้จะใช้เป็นโครงสร้างหลัก สำหรับปฏิบัติการ ตอนต่อไปในครั้งที่ ๔ ตอนที่ ๓ สิทธิการใช้งานไดเรกทอรี ------------------------------------ ปฏิบัติการที่ ๒ มีการเปลี่ยนสิทธิการใช้งานเฉพาะ "แฟ้ม" เท่านั้น สิทธิในการใช้งานไดเรกทอรี เป็นไปตามค่าที่กำหนดไว้ใน startup file ของแต่ละคน และปฏิบัติการตอนที่ ๑ เป็นการทดลองลบแฟ้ม ~/886326/K/xx.txt หรือ ~/886326/K/yy.txt ซึ่งเจ้าของมีสิทธิ "read" เพียงอย่างเดียว ในกรณีนี้ซึ่งระบบปฏิบัติจะสอบถามความสมัครใจของเจ้าของแฟ้ม ว่าต้องการลบหรือไม่? หากต้องการลบก็สามารถลบได้ ทั้งนี่เพราะสิทธิในการลบแฟ้มขึ้นอยู่กับสิทธิ "write" ของไดเรกทอรี ก่อนที่จะเริมปฏิบัติการควรศึกษาการใช้งานคำสั่ง rm (ลบแฟ้ม) และ คำสั่ง rmdir (ลบไดเรกทอรี) ต่อไปนี้ให้เข้าใจเสียก่อน คำสั่งลบแฟ้ม - rm (remove files or directories) ---------------------------------------------------- rm <ชื่อแฟ้มที่ต้องการลบซึ่งอาจเป็นแฟ้มเดียวหรือหลายแฟ้มก็ได้> การลบแฟ้มจะสามารถกระทำได้ เมื่อ 1. ผู้ดำเนินการเป็นเจ้าของแฟ้มนั้น 2. ผู้ดำเนินการมีสิทธิ "write" ในไดเรกทอรีนั้น และ 3. แฟ้มนั้นอยู่ "ใน" หรืออยู่ "ใต้" ไดเรกทอรีปัจจุบันของผู้ดำเนินการ การลบแฟ้มด้วยคำสั่ง rm จะดำเนินการโดยไม่มีการเตือน หากต้องการให้ระบบแสดงข่าวเตือนในการลบแฟ้มแต่ละแฟ้ม สามารถทำได้โดย ใช้ option -i (interactive - โต้ตอบกับผู้ใช้) เช่น $ rm -i yy.txt rm: remove regular file `yy.txt'? # ผู้ใช้สามารถเลือกตอบ y เพื่อลบ หรือ n เพื่อยกเลิกการลบได้ option -i มีประโยชน์ในการลบแฟ้มครั้งละหลายแฟ้ม โดยใช้ wildcard ในชื่อแฟ้ม ซึ่งผู้ใช้สามารถ เลือกลบหรือไม่ลบได้ทีละแฟ้ม ระบบจะทำการเตือนเพียงกรณีเดียวคือการลบแฟ้มที่เจ้าของไม่มีสิทธิ write (แฟ้มอ่านอย่างเดียว) ตามที่เคยดำเนินการมาแล้วในปฏิบัติการ ครั้งที่ ๒ หากไม่ต้องการให้เตือน สามารถทำได้โดยใช้ option -f (force - บังคับดำเนินการโดยไม่ต้องถามผู้ใช้) โดยปกติคำสั่ง rm จะสามารถลบได้เฉพาะแฟ้ม หากนำไปใช้ลบไดเรกทอรีจะไม่สามารถดำเนินการได้ เช่น กำหนดให้ไดเรกทอรีปัจจุบันเป็น ~/886326/K หากใช้คำสั่ง rm G เพื่อลบไดเรกทอรี G จะได้ผลดังนี้ $ rm G rm: cannot remove `G': Is a directory # rm ไม่สามารถลบได้ เนื่องจาก G เป็นไดเรกทอรี การลบไดเรกทอรี ------------------ rm <ชื่อไดเรกทอรีที่ต้องการลบ> การลบไดเรกทอรีเป็นไปตามกฏสามข้อของแฟ้ม และจะลบไดเรกทอรีได้ต่อเมื่อไดเรกทอรีนั้น "ว่าง" หากพยายามลบไดเรกทอรีที่มีแฟ้ม อยู่จะปรากฏผลดังนี้ กำหนดให้ไดเรกทอรีปัจจุบันเป็น ~/886326/K หากใช้คำสั่ง rmdir F เพื่อลบไดเรกทอรี F จะได้ผลดังนี้ $ rmdir F rmdir: failed to remove `F': Directory not empty # ไม่สามารถลบได้ เพราะยังมีแฟ้มอยู่ในไดเรกทอรี # หรือยังไม่เป็นไดเรกทอรีว่าง การลบไดเรกทอรีที่ยังคงมีแฟ้มอยู่จะทำได้เพียงอย่างเดียว การใช้คำสั่ง rm โดยใช้ option -r (recursive) ซึ่งจะทำการลบแฟ้มทั้งหมด ในไดเรกทอรีที่ระบุ แล้วจึงลบไดเรกทอรี option นี่มีประสิทธิภาพสูงมาก หากใช้ผิดที่จะทำให้เกิดปัญหาได้มาก หากต้องการใช้ให้อ่าน คู่มือให้เข้าใจ ถ้าอ่านคู่มือด้วยตนเองได้เข้าใจ ก็น่าจะใช้โดยไม่เกิดอันตรายได้ ปฏิบัติการ ---------- กำหนดให้ไดเรกทอรีปัจจุบันอยู่ใน ~/886326/K ใช้คำสั่ง chmod เปลี่ยนสิทธิของไดเรกทอรี G ให้เจ้าของมีสิทธิ "read" และ "execute" หรือ r-x --- --- 1. เมื่อเปลี่ยนแปลงสิทธฺเรียบร้อยแล้ว สามารถใช้คำสั่ง cd เพื่อเข้าสู่ไดเรกทอรี G ได้หรือไม่? --> การเปลี่ยนไดเรกทอรีขึ้นกับสิทธิ ... ... ... ของไดเรกทอรี 2. เมื่อไดเรกทอรีปัจจุบันเป็น ~/886326/K/G แล้ว ตรวจสอบสิทธิการใช้งานแฟ้ม yy.txt ว่าเป็น - r-- --- --- ถูกต้องตามที่กำหนด หรือไม่ หากไม่ถูก แก้ไขให้เป็นตามที่กำหนดก่อน แล้วจึงทดลองลบแฟ้ม yy.txt ดังนี้ $ rm yy.txt rm: remove write-protected regular file `yy.txt'? y # ระบบเตือนว่าแฟ้ม yy.txt เป็นแฟ้มชนิดป้องกัน # การเขียน (อ่านอย่างเดียว) -- ต้องการลบหรือไม่ rm: cannot remove `yy.txt': Permission denied # ระบบแจ้งว่าไม่สามารถลบได้ เพราะไม่มีสิทธิ หากต้องการลบแฟ้มในไดเรกทอรีนี้ จะต้องทำอย่างไร?