Linux Basics

บทนำ

ในปฏิบัติการนี้นักศึกษาจะได้ใช้คำสั่ง 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.txt
Fri 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 คือ

  1. Command line arguments เป็นส่วนหนึ่งของการเรียกใช้โปรแกรม และจะส่งข้อมูลให้โปรแกรมก่อนที่มันจะเริ่มทำงาน เป็นการป้อนข้อมูลให้โปรแกรมเพียงครั้งเดียว
  2. Input stream จะส่งข้อมูลให้โปรแกรมหลังจากที่มันเริ่มทำงานแล้ว โดยโปรแกรมเมื่อเริ่มทำงานแล้วอาจโต้ตอบกับผู้ใช้เพื่อรับข้อมูลเพิ่มเติมได้อีก

เพื่อแก้ไขปัญหาดังกล่าว เราสามารถใช้คำสั่ง xargs เพื่อแปลง Standard output (output หมายเลข 1) ไปเป็น argument ของคำสั่งถัดไปได้

พิจารณาคำสั่งต่อไปนี้ คำสั่ง date จะส่ง output stream เป็น input stream ของคำสั่ง xargs ซึ่ง xargs ก็จะแปลงข้อมูลใน input stream เป็น input arguments และส่งให้กับคำสั่ง echo

itsci@ITSCI:~$  date | xargs echo
Mon 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:~$  ls
date.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 | rm
rm: 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].txt
user1.txt  user2.txt
itsci@ITSCI:~$   ls user{1..2}.txt
user1.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 deleteme
rm: 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.txt
Hello, this is file1.txt.
itsci@ITSCI:~$ cp file1.txt file2.txt
itsci@ITSCI:~$ cat file2.txt
Hello, 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.txt

1 directory, 4 files
itsci@ITSCI:~$ cat dest/file2.txt
Hello, this is file1.txt.

Lab Part 6 – Moving และ Renaming Files และ Directories

คำสั่ง mv ใช้สำหรับย้ายหรือเปลี่ยนชื่อ file หรือ directory ตัวอย่างการใช้คำสั่ง mv ดังแสดงต่อไปนี้

itsci@ITSCI:~$ ls
dest  file1.txt  file2.txt
itsci@ITSCI:~$ mv file1.txt fileA.txt
itsci@ITSCI:~$ ls
dest  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

จากที่โจทย์กำหนดให้ จงตอบคำถามต่อไปนี้:

  1. จงเขียนคำสั่ง command line หากต้องการลบไฟล์ที่ขึ้นต้นด้วย file
  2. จงเขียนคำสั่ง command line หากต้องการลบไฟล์ที่มีนามสกุล .png หรือ .jpg
  3. จงเขียนคำสั่ง 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
อ.ดร.วัชรินทร์ สาระไชย
อ.ดร.วัชรินทร์ สาระไชย

Hello! I’m Watcharin Sarachai, an enthusiastic and dedicated educator with a passion for advancing the field of computer science. I hold a Ph.D. in Computer Science from Chiang Mai University, where I focused on cutting-edge research in Machine Learning, Computer Programming, and Embedded Systems.

Articles: 19