Linux Basics
- บทนำ
- Pre-Lab
- Lab Part 1 – Piping
- Lab Part 2 – Tee command
- Lab Part 3 – Xargs Command
- Lab Part 4 – การสร้าง File และ Directory
- Lab Part 5 – Copying Files และ Folders
- Lab Part 6 – Moving และ Renaming Files และ Directories
- Lab Part 7 – แบบฝึกหัด
บทนำ
ในปฏิบัติการนี้นักศึกษาจะได้ใช้คำสั่ง Linux ในรูปแบบ command line ที่มีความซับซ้อนมากขึ้นเพื่อให้เข้าใจการทำงานเชิงลึกของระบบเครื่องคอมพิวเตอร์เพิ่มมากขึ้น ในแบบไม่มีกราฟฟิก (การทำงานทั่วไปที่มี Graphic User Interface และการใช้เมาส์) นั้นคือเราจะใช้คีย์บอร์ดพิมพ์คำสั่งโต้ตอบกับระบบปฏิบัติการ และระบบปฏิบัติการก็จะแสดงผลลัพธ์ออกมาเป็นข้อความเท่านั้น เมื่อเราเข้าใจคำสั่งแบบ command line มากขึ้น การใช้คำสั่ง command line อื่น ๆ ที่ใช้กันอย่างแพร่หลายในปัจจุบันก็จะมีรูปแบบที่เหมือนกันทั้งหมด
Pre-Lab
จากปฏิบัติการที่ 1 (Lab-01) นักศึกษาได้ติดตั้งโปรแกรมที่จำเป็นไปแล้ว หากมีปัญหาใด ๆ สามารถกลับไปตรวจสอบการติดตั้งให้สำบูรณ์ก่อนเริ่มทำปฏิบัติการนี้
หากทุกอย่างถูกต้องให้เริ่มรันระบบปฏิบัติการ Ubuntu container โดยใช้ Docker โดยให้นักศึกษารันคำสั่งดังต่อไปนี้
คำสั่งสำหรับระบบปฏิบัตการ Windows
docker run -h "ITSCI" -u itsci --workdir /home/itsci --name ubuntu-itsci -it --rm wsarachai/ubuntu-itsci:linux-amd64
คำสั่งสำหรับระบบปฏิบัตการ MacOS
docker run -h "ITSCI" -u itsci --workdir /home/itsci --name ubuntu-itsci -it --rm wsarachai/ubuntu-itsci:latest
เมื่อเราเคยรันคำสั่งมาแล้วระบบปฏิบัติการ Ubuntu หรือ Ubuntu container ใน Docker จะทำงานและพร้อมรอรับคำสั่งดังแสดงต่อไปนี้
itsci@ITSCI:~$ _
Lab Part 1 – Piping
ในปฏิบัติการนี้ เราจะเริ่มต้นด้วยการทำความเข้าใจกับ piping ซึ่งเป็นการส่งผลลัพธ์จากคำสั่งแรกไปยังคำสั่งถัดไป โดยคล้ายกับการต่อท่อให้น้ำไหลจากที่หนึ่งไปยังที่หนึ่งอีกที่หนึ่ง เช่นเราส่งผลลัพธ์จากคำสั่ง command 1 ไปให้เป็น input ของ command 2 ดังแสดงในรูปต่อไปนี้
Piping คือการส่ง output ของ command1 ไปเป็น input ของ command2
ตัวอย่างเช่น
1. เมื่อเราพิมพ์คำสั่ง “date 1> today.txt” เพื่อส่งผลลัพธ์ไว้เก็บไว้ในไฟล์ “today.txt”
itsci@ITSCI:~$ date 1> today.txt
itsci@ITSCI:~$ cat today.txtFri Apr 28 18:04:23 +07 2023
2. หากเราต้องการแยกแต่ละคำในประโยค “Fri Apr 28 18:04:23 +07 2023” ที่เก็บไว้ในไฟล์ “today.txt” เราสามารถใช้คำสั่ง cut เพื่อดำเนินการนี้ได้ โดยคำสั่ง cut จะทำหน้าที่ตัดทุกคำในประโยคโดยใช้ช่องว่างเป็นตัวคั่น (delimiter) ดังนั้นในกรณีนี้เราจะใช้ช่องว่างเป็น delimiter ตัวอย่างการแยกแต่ละคำในไฟล์ “today.txt” ด้วยคำสั่ง cut เช่น
จะเห็นได้ว่าคำว่า “Fri” เมื่อตัดคำแล้วจะอยู่ในลำดับที่ 1 และเราจะใช้ option “–fields 1” เพื่อระบุเอาคำในตำแหน่งที่ 1 ออกมา ตัวอย่างการใช้ option fields ในตำแหน่งต่าง ๆ เช่น
itsci@ITSCI:~$ cut < date.txt --delimiter " " --fields 1
Fri
itsci@ITSCI:~$ cut < date.txt --delimiter " " --fields 2
Apr
itsci@ITSCI:~$ cut < date.txt --delimiter " " --fields 3
28
itsci@ITSCI:~$ cut < date.txt --delimiter " " --fields 4
18:04:23
จากตัวอย่างคำสั่ง cut เรานำเข้าข้อมูลจาก input ที่เป็นไฟล์ นอกจากนั้นเรายังสามารถส่ง input จากคำสั่งแทนการอ่านจากไฟล์ได้ ในที่นี้เราจะใช้คำสั่งต่อไปนี้เพื่อแสดงการทำงานอีกรูปแบบ เราจะส่งผลลัพธ์จากคำสั่ง date เป็น input ให้กับคำสั่ง cut โดยที่เราไม่ต้องใช้ไฟล์เป็น input อีกต่อไป ดังนั้นในกรณีนี้เราจะใช้เทคนิคที่เรียกว่า “piping”
ใน Linux สัญญลักษณ์ “|
” จะเรียกว่า piping ดังนั้นการ piping เอา output ของคำสั่ง data ไปเป็น input ให้คำสั่ง cut สามารถเขียนได้ดังแสดงต่อไปนี้
ผลลัพธ์ที่ได้จะแสดงคำที่ตัดได้ในลำดับที่ 1 นั่นก็คือ “Fri”
3. การใช้ piping สามารถส่งต่อไปบันทึกลงไฟล์ได้เช่นกัน ตัวอย่างเช่น การส่งผลลัพธ์ “Fri” ของคำสั่งก่อนหน้านี้ไปไปเก็บไว้ในไฟล์ “today.txt”
itsci@ITSCI:~$ date | cut --delimiter " " --fields 1 > today.txt
อย่างไรก็ตามเราสามารถวาง argument “> today.txt” ตำแหน่งไหนก็ได้หลังคำสั่ง cut เช่น
itsci@ITSCI:~$ date | cut > today.txt --delimiter " " --fields 1
itsci@ITSCI:~$ date | cut --delimiter " " > today.txt --fields 1
การบันทึกผลลัพธ์ลงไฟล์จะเป็นการส่งข้อมูลไปยัง Standard output และไม่สามารถส่งต่อไปยังคำสั่งถัดไปได้อีก ดังนั้นหากเราใช้คำสั่งเพื่อบันทึกลงไฟล์แล้วตามด้วย piping ก็จะไม่มีข้อมูลส่งมาให้คำสั่งถัดไป เช่นในตัวอย่างคำสั่งต่อไปนี้ ผลลัพธ์จะถูกบันทึกลงในไฟล์ data.txt และจะสิ้นสุดที่จุดนั้นโดยไม่มีผลลัพธ์ที่ส่งมาให้คำสั่ง cut และไม่มีผลลัพธ์ที่แสดงออกมา
itsci@ITSCI:~$ date > date.txt | cut --delimiter " " --fields 1
กรณีนี้จะไม่แสดง output ออกมา เนื่องจาก output สิ้นสุดที่ไฟล์ date.txt แล้วนั่นเอง
หากต้องการให้ผลลัพธ์เป็น input สำหรับคำสั่ง cut ในกรณีนี้ควรแยกการทำงานออกเป็นขั้นตอนสองขั้นตอนคือบันทึกผลลัพธ์ลงในไฟล์ก่อนแล้วจึงใช้ไฟล์นั้นเป็น input สำหรับคำสั่ง cut เช่น
itsci@ITSCI:~$ date > date.txt
itsci@ITSCI:~$ cut --delimiter " " --fields 1 < date.txt
Lab Part 2 – Tee Command
เพื่อแก้ไขปัญหาการสิ้นสุดของ standard output ในบางคำสั่งของ Linux เราจะใช้คำสั่ง tee เพื่อทำการสำเนา (duplicate) ข้อมูลจาก standard input ไปยัง standard output เพื่อแก้ปัญหาการสิ้นสุดของ standard output ในบางคำสั่งของ Linux ที่ piping แล้วข้อมูลสิ้นสุดลงที่ standard output และไม่สามารถส่งต่อไปได้อีก การทำงานของคำสั่ง tee ดังแสดงในรูปแต่ไปนี้
จากรูปจะเห็นได้ว่าผลลัพธ์จากคำสั่ง ls -l
เมื่อ piping แล้วสิ้นสุดลงที่เก็บไว้ในไฟล์ file.txt แต่คำสั่ง tee จะสำเนาผลลัพธ์นั้นส่งต่อไปยังคำสั่งถัดไปได้ ในกรณีนี้คือคำสั่ง less
อีกตัวอย่างเช่นการใช้คำสั่ง date และ output จะสิ้นสุดลงที่คำสั่ง cut
itsci@ITSCI:~$ date | cut --delimiter " " --fields 1
Sun
จากคำสั่งก่อนหน้านี้สามารถนำคำสั่ง tee เข้ามาใช้ เช่น
itsci@ITSCI:~$ date | tee fulldate.txt | cut --delimiter " " --fields 1
Sun
จะเห็นได้ว่า output จากคำสั่ง date ส่งต่อให้คำสั่ง tee จากนั้นจะแยกเป็นสองทาง ทางหนึ่งเก็บไว้ในไฟล์ชื่อ “fulldate.txt” และอีกทางหนึ่งส่งต่อไปยังคำสั่ง cut ดังแสดงในรูปต่อไปนี้
Lab Part 3 – Xargs Command
คำสั่ง xargs ที่ใช้ใน Linux ทำหน้าที่แปลง input จาก Standard input ให้เป็น arguments ของเป็นคำสั่งถัดไป หรือพูดง่าย ๆ ก็คือคำสั่ง xargs จะแปลง output ของคำสั่งหนึ่งไปเป็น input ของอีกคำสั่งหนึ่งแต่จะส่งต่อเป็นแบบ arguments (อย่าสับสันกับการส่ง input ซึ่งไม่เหมือนกับการส่งเป็น arguments)
ใน Linux บางคำสั่งจะไม่รับ Standard input แต่จะรับข้อมูลผ่าน arguments เท่านั้นเช่นคำสั่ง echo
itsci@ITSCI:~$ echo Hello
Hello
จากตัวอย่างคำสั่ง echo รับข้อมูลเข้า “Hello” เป็นแบบ argument และแสดงผลออกไปที่ Standard output ซึ่งคำสั่ง echo จะรับข้อมูลเข้าเป็นแบบ arguments เท่านั้นดังแสดงในรูปต่อไปนี้
นั่นคือหากใช้คำสั่ง “date | echo
” จะไม่มีผลลัพธ์ออกมาเนื่องจากคำสั่ง echo ไม่รับ Standard input โดยจะรับแต่ input แบบ argument เท่านั้น
เช่นคำสั่งต่อไปนี้เป็นการส่ง input ให้กับคำสั่ง echo ซึ่งไม่มีช่องทางรับ input จึงไม่แสดงผลลัพธ์ออกมา
itsci@ITSCI:~$ date | echo
ข้อแตกต่างระหว่าง arguments และ input stream คือ
- Command line arguments เป็นส่วนหนึ่งของการเรียกใช้โปรแกรม และจะส่งข้อมูลให้โปรแกรมก่อนที่มันจะเริ่มทำงาน เป็นการป้อนข้อมูลให้โปรแกรมเพียงครั้งเดียว
- Input stream จะส่งข้อมูลให้โปรแกรมหลังจากที่มันเริ่มทำงานแล้ว โดยโปรแกรมเมื่อเริ่มทำงานแล้วอาจโต้ตอบกับผู้ใช้เพื่อรับข้อมูลเพิ่มเติมได้อีก
เพื่อแก้ไขปัญหาดังกล่าว เราสามารถใช้คำสั่ง xargs เพื่อแปลง Standard output (output หมายเลข 1) ไปเป็น argument ของคำสั่งถัดไปได้
พิจารณาคำสั่งต่อไปนี้ คำสั่ง date จะส่ง output stream เป็น input stream ของคำสั่ง xargs ซึ่ง xargs ก็จะแปลงข้อมูลใน input stream เป็น input arguments และส่งให้กับคำสั่ง echo
itsci@ITSCI:~$ date | xargs echoMon May 1 11:31:38 +07 2023
itsci@ITSCI:~$ date | xargs echo “hello”hello Mon May 1 11:31:38 +07 2023
คำสั่ง rm สำหรับลบไฟล์
itsci@ITSCI:~$ lsdate.txt deleteme.txt today.txt
itsci@ITSCI:~$ rm deleteme.txt
itsci@ITSCI:~$ ls
date.txt today.txt
หรือการลบหลายไฟล์พร้อมกันในทีเดียว
itsci@ITSCI:~$ rm deleteme.txt date.txt today.txt
อีกตัวอย่าง เมื่อเรามีไฟล์ชื่อ “filetodelete.txt” มีข้อมูลรายชื่อไฟล์ เช่น
itsci@ITSCI:~$ cat filestodelete.txt
date.txt
today.txt
จากนั้นใช้คำสั่ง
itsci@ITSCI:~$ cat filetodelete.txt | rmrm: missing operand
Try ‘rm –help’ for more information.
ในกรณีนี้จะไม่สามารถทำได้ เนื่องจากคำสั่ง rm ไม่รับ Standard Input เช่นเดียวกับคำสั่ง echo ดังนั้นคำสั่ง xargs จึงมีบทบาทสำคัญที่ช่วยให้ความต้องการนี้สำเร็จ โดยแก้ไขคำสั่งดังแสดงต่อไปนี้
itsci@ITSCI:~$ cat filetodelete.txt | xargs rm
Lab Part 4 – การสร้าง File และ Directory
การใช้งาน Wildcards
การใช้เครื่องหมาย * กับคำสั่ง ls เพื่อค้นหา file และ directory
เครื่องหมาย * คือ pattern ที่ใช้แทนชื่อของ file หรือ directory ใช้สำหรับแสดงรายการ file และ directory ทั้งหมด เช่น
itsci@ITSCI:~$ ls *
itsci@ITSCI:~$ ls Do*
itsci@ITSCI:~$ ls *.txt
จะเห็นได้ว่าการใช้เครื่องหมาย * แสดง file และ directory ทั้งหมดที่มีอยู่ใน directory ปัจจุบันออกมา ส่วนคำสั่ง ls Do*
จะแสดงทุก file และ directory ที่มีชื่อที่ขึ้นต้นด้วย “Do” และคำสั่งสุดท้ายจะแสดงทุก file และ directory ที่มีนามสกุลเป็น “.txt”
การใช้เครื่องหมาย ? กับคำสั่ง ls เพื่อค้นหา file และ directory
เครื่องหมายคือ ? แทนตัวอักษรอะไรก็ได้หนึ่งตัว ตัวอย่างเช่น
itsci@ITSCI:~$ ls file?.txt
itsci@ITSCI:~$ ls ??.txt
คำสั่งแรกแสดงไฟล์ที่มีชื่อขึ้นต้นด้วย file?.txt ตามด้วยตัวอักษรอะไรก็ได้อีกหนึ่งตัวเท่านั้น และอีกคำสั่งแสดงไฟล์ที่มีชื่อที่ประกอบไปด้วยตัวอักษรอะไรก็ได้แต่มีสองตัว
การใช้เครื่องหมาย [ ] กับคำสั่ง ls เพื่อค้นหา file และ directory
เครื่องหมาย [ ] แทนตัวอักษรหนึ่งตัวเหมือน ? แต่สามารถระบุช่วงข้อมูลได้ เช่น การแสดงรายการ file1.txt, file2.txt, และ file3.txt จะใช้คำสั่ง
itsci@ITSCI:~$ ls file[123].txt
แสดงรายการ file0.txt – file9.txt
itsci@ITSCI:~$ ls file[0123456789].txt
แสดงรายการ file0.txt – file9.txt แบบกำหนดช่วง
itsci@ITSCI:~$ ls file[0-9].txt
แสดงรายการ fileA.txt – fileZ.txt
itsci@ITSCI:~$ ls file[A-Z].txt
แสดงรายการ file0A.txt – file9Z.txt
itsci@ITSCI:~$ ls file[0-9][A-Z].txt
แสดงรายการ file0.txt หรือ fileA.txt และอื่น ๆ
itsci@ITSCI:~$ ls file[0-9ABC].txt
เครื่องหมาย { } Spread Expression
เครื่องหมาย { } (Spread Expression) สามารถใช้ได้หลากหลายมากกว่าการใช้เครื่องหมาย [] ซึ่งสามารถนำมาใช้กับคำสั่ง ls เท่านั้น เครื่องหมาย {} จะใช้แทนตัวอักษรหนึ่งตัวเหมือนเครื่องหมาย ? แต่สามารถระบุช่วงข้อมูลได้ ตัวอย่างเช่น การใช้คำสั่ง touch เพื่อสร้างไฟล์ในคราวเดียวพร้อมกัน 3 ไฟล์ (user1.txt, user2.txt, และ user3.txt) จากนั้นเราจะใช้เครื่องหมาย [] และ {} ในการแสดงไฟล์เหล่านี้ออกมา เช่น
itsci@ITSCI:~$ touch user1.txt user2.txt user3.txt
itsci@ITSCI:~$ ls
user1.txt user2.txt user3.txt
itsci@ITSCI:~$ ls user[1-2].txtuser1.txt user2.txt
itsci@ITSCI:~$ ls user{1..2}.txtuser1.txt user2.txt
การสร้าง File
คำสั่ง touch ใช้สำหรับสร้างไฟล์ เช่นหากต้องการสร้าง file ชื่อ file1.txt และ file2.txt ไว้ที่ Home directory จะใช้คำสั่ง
itsci@ITSCI:~$ touch file1.txt
itsci@ITSCI:~$ touch /home/itsci/file2.txt
การสร้าง file ด้วยคำสั่ง touch จะเป็นการสร้าง file ว่าง (ไม่มีข้อมูลอะไรอยู่ในไฟล์) หากต้องการสร้างไฟล์พร้อมข้อมูลเราปรับรูปแบบจากคำสั่ง echo
แทนเช่น
itsci@ITSCI:~$ echo “hello” > file1.txt
การสร้าง Directory
เราจะใช้คำสั่ง mkdir (Make Directory) เช่น
itsci@ITSCI:~$ mkdir folder
itsci@ITSCI:~$ mkdir ~/Pictures/holiday
การสร้าง directory ซ้อนกันในทีเดียวหลาย ๆ ชั้น เช่นการสร้าง directory “bla/thing/itsci” จะไม่สามารถทำได้หาก directory แรกยังไม่ได้สร้างไว้ เช่น
itsci@ITSCI:~$ mkdir bla/thing/itsci
คำสั่งข้างต้นไม่สามารทำได้ หาก directory ชื่อ bla ยังไม่มี อย่างไรก็ตามเราสามารถทำได้โดยการเพิ่ม option “-p” เข้าไปตัวอย่างเช่น
itsci@ITSCI:~$ mkdir -p bla/thing/itsci
คำสั่ง mkdir สามารถสร้างพร้อม ๆ กันหลาย directory ได้ ในกรณีนี้เราสร้าง directory ไว้ในที่เดียวกันคือ “happy, birthday”
itsci@ITSCI:~$ mkdir happy birthday
itsci@ITSCI:~$ tree.
├── birthday
└── happy
เราสามารถใช้คำสั่ง mkdir เพื่อสร้างหลาย ๆ directory หรือ file พร้อม ๆ กัน โดยใช้ความสามารถของสัญลักษณ์ {} จากตัวอย่างต่อไปนี้จะเห็นได้ว่าเรานำเครื่องหมาย {} ร่วมกับคำสั่ง mkdir ในการสร้างหลาย ๆ directory ในคราวเดียว
itsci@ITSCI:~$ rm -rf happy birthday <== ลบ directory
itsci@ITSCI:~/tmp$ mkdir {project1,project2}_{A,B}
itsci@ITSCI:~/tmp$ tree.
├── project1_A
├── project1_B
├── project2_A
└── project2_B
itsci@ITSCI:~$ touch {project1,project2}_{A,B}.txt
itsci@ITSCI:~$ tree.
├── project1_A
├── project1_A.txt
├── project1_B
├── project1_B.txt
├── project2_A
├── project2_A.txt
├── project2_B
└── project2_B.txt
itsci@ITSCI:~$ rm -rf project{1..2}_{A..B}.txt <== ลบ file
itsci@ITSCI:~$ tree.
├── project1_A
├── project1_B
├── project2_A
└── project2_B
จะเห็นได้ว่าเราใช้ {} ซึ่งในกรณีนี้การใช้เครื่องหมาย [] จะไม่สามารถทำได้ อีกตัวอย่างเป็นการสร้าง file และ directory ครั้งละมาก ๆ ตัวอย่างเช่น
itsci@ITSCI:~$ mkdir {project1,project2}_{A..Z}
itsci@ITSCI:~/tmp$ tree.
├── project1_A
├── project1_B
├── project1_C
├── project1_D
├── project1_E
├── project1_F
├── project1_G
├── project1_H
├── project1_I
├── project1_J
├── project1_K
├── project1_L
├── project1_M
├── project1_N
├── project1_O
├── project1_P
├── project1_Q
├── project1_R
├── project1_S
├── project1_T
├── project1_U
├── project1_V
├── project1_W
├── project1_X
├── project1_Y
├── project1_Z
├── project2_A
├── project2_B
├── project2_C
├── project2_D
├── project2_E
├── project2_F
├── project2_G
├── project2_H
├── project2_I
├── project2_J
├── project2_K
├── project2_L
├── project2_M
├── project2_N
├── project2_O
├── project2_P
├── project2_Q
├── project2_R
├── project2_S
├── project2_T
├── project2_U
├── project2_V
├── project2_W
├── project2_X
├── project2_Y
└── project2_Z
itsci@ITSCI:~$ touch {project1,project2}_{A..Z}/file{1..100}.txt
itsci@ITSCI:~$ tree.
├── project1_A│ ├── file1.txt
│ ├── file2.txt│ ├── ...
│ └── file100.txt├── project...
│ ├── file1.txt
│ ├── file2.txt
│ ├── ...
│ └── file100.txt└── project2_Z
├── file1.txt
├── file2.txt
├── ...
└── file100.txt
คำสั่ง rm ใช้ลบ file
ตัวอย่างเช่น
itsci@ITSCI:~$ touch Documents/deleteme
itsci@ITSCI:~$ rm deletemerm: cannot remove 'deleteme': No such file or directory
คำสั่งก่อนหน้านี้ไม่สามารถทำได้เนื่องจาก deleteme ไม่ได้อยู่ใน directory ปัจจุบัน ที่ถูกต้องก็คือจะต้องระบุ absolute path ให้ถูกต้อง เช่น
itsci@ITSCI:~$ rm Documents/deleteme
คำสั่ง rm ใช้ลบ directory จำเป็นต้องเพิ่ม options “-r” ด้วย โดย option “-r” หมายถึงลบ directories และทุกอย่างทั้ง files, directories ที่ซ้อนต่อ ๆ กันไปใน directory (recursively)
itsci@ITSCI:~$ mkdir -p deleteme/folder{1..3}
itsci@ITSCI:~$ tree.
└── deleteme
├── folder1
├── folder2
└── folder3
itsci@ITSCI:~$ rm –r deleteme
itsci@ITSCI:~$ ls
Lab Part 5 – Copying Files และ Folders
คำสั่ง cp ใช้สำหรับคัดลอง file ตัวอย่างเช่น
itsci@ITSCI:~$ echo "Hello, this is file1.txt." > file1.txt
itsci@ITSCI:~$ cat file1.txtHello, this is file1.txt.
itsci@ITSCI:~$ cp file1.txt file2.txt
itsci@ITSCI:~$ cat file2.txtHello, this is file1.txt.
itsci@ITSCI:~$ mkdir dest
itsci@ITSCI:~$ cp file1.txt dest/
itsci@ITSCI:~$ cp file1.txt dest/file2.txt
itsci@ITSCI:~$ tree.
├── dest
│ ├── file1.txt
│ └── file2.txt
├── file1.txt
└── file2.txt1 directory, 4 files
itsci@ITSCI:~$ cat dest/file2.txtHello, this is file1.txt.
Lab Part 6 – Moving และ Renaming Files และ Directories
คำสั่ง mv ใช้สำหรับย้ายหรือเปลี่ยนชื่อ file หรือ directory ตัวอย่างการใช้คำสั่ง mv ดังแสดงต่อไปนี้
itsci@ITSCI:~$ lsdest file1.txt file2.txt
itsci@ITSCI:~$ mv file1.txt fileA.txt
itsci@ITSCI:~$ lsdest file2.txt fileA.txt
itsci@ITSCI:~/tmp$ tree.
├── dest
│ ├── file1.txt
│ └── file2.txt
├── file2.txt
└── fileA.txt
1 directory, 4 files
itsci@ITSCI:~/tmp$ mv dest dest-dir
itsci@ITSCI:~/tmp$ tree.
├── dest-dir
│ ├── file1.txt
│ └── file2.txt
├── file2.txt
└── fileA.txt
1 directory, 4 files
itsci@ITSCI:~/tmp$ mv dest-dir/* .
itsci@ITSCI:~/tmp$ tree.
├── dest-dir
├── file1.txt
├── file2.txt
└── fileA.txt
1 directory, 3 files
itsci@ITSCI:~/tmp$ mv file* dest-dir/
itsci@ITSCI:~/tmp$ tree.
└── dest-dir
├── file1.txt
├── file2.txt
└── fileA.txt
1 directory, 3 files
Lab Part 7 – แบบฝึกหัด
จงตอบคำถามต่อไปนี้ คำสั่งไหนถูกต้องและคำสั่งไหนไม่สามารถทำได้ และเพราะเหตุใด
1) itsci@ITSCI:~$ date | tee fulldate.txt | cut --delimiter " " --fields 1 > today.txt
2) itsci@ITSCI:~$ date | tee fulldate.txt | cut --delimiter " " --fields 1 > today.txt | cat
3) itsci@ITSCI:~$ date | tee fulldate.txt | cut --delimiter " " --fields 1 | tee today.txt | cat
จงตอบคำถามต่อไปนี้ อะไรคือ output ที่พิมพ์ออกมาที่ Terminal จากคำสั่งต่อไปนี้
1) itsci@ITSCI:~$ date | cut --delimiter=“ ” --fields=1 | echo
2) itsci@ITSCI:~$ date | cut --delimiter=“ ” --fields=1 | xargs echo
กำหนดให้เรามีไฟล์ดังต่อไปนี้
- file1.txt, file2.png, file3.jpg
- itsci1.txt, itsci2.png, itsci3.jpg
จากที่โจทย์กำหนดให้ จงตอบคำถามต่อไปนี้:
- จงเขียนคำสั่ง command line หากต้องการลบไฟล์ที่ขึ้นต้นด้วย file
- จงเขียนคำสั่ง command line หากต้องการลบไฟล์ที่มีนามสกุล .png หรือ .jpg
- จงเขียนคำสั่ง command line หากต้องการลบไฟล์ที่มี *2* หรือ *[2,3]*
ให้ใช้ wildcard ในการแก้ปัญหานี้
จงใช้คำสั่ง Linux สร้าง directories และ files ดังแสดงต่อไปนี้
** กำหนดให้นักศึกษาจะต้องใช้คำสั่งในการสร้างเพียง 1 – 2 คำสั่งเท่านั้น
itsci@ITSCI:~/tmp$ tree.
└── deleteme
├── folder1
│ ├── file1.txt
│ ├── file2.txt
│ └── file3.txt
├── folder2
│ ├── file1.txt
│ ├── file2.txt
│ └── file3.txt
└── folder3
├── file1.txt
├── file2.txt
└── file3.txt