[
Printer Friendly]
ผู้เขียน/โดย : เกริก ภิรมย์โสภา (Krerk Piromsopa)
เขียนเมื่อ/ปรับปรุง : 2006-01-30 01:19:42
มีผู้เยี่ยมชมทั้งสิ้น : 8200
หลายคนอาจจะเคยมีปัญหา เรื่องการค้นหาข้อมูลบน Unix เนื่องจากไม่มี tool
สะดวกให้ใช้เหมือน Windows อันที่จริงแล้ว Unix หรือ Unix-Like ทั้งหลาย
มาพร้อมกับเครื่องมือหลายอย่าง แต่เราอาจจะต้องนำมาประกอบกัน
เพื่อใช้ให้ถูกต้องเท่านั้นเอง เพื่อไม่ให้เสียเนื้อที่
มาศึกษากันเลยละกันครับ เราจะเริ่มต้นด้วยการใช้ find ง่ายๆ แล้วค่อยๆ
ลงรายละเอียดไปยังการใช้ร่วมกับคำสั่งอื่นๆ
ค้นหาด้วย Find
find [path ...] [expression]
ง่ายๆ ตรงไปตรงมาคือ find ตามด้วย path เช่น find /home จะหาไฟล์ที่อยู่ใน
/home ทั้งหมด คราวนี้ลองใส่เงี่อนไขเข้าไปง่าย เช่น หาไฟล์ที่ลงท้ายด้วย
.c เราก็ระบุ option -name เข้าไปเป็น find /home -name "*.c" เป็นต้น
เนื่องจากธรรมชาติของ Unix ซึ่งเขียนด้วยภาษา C จะเป็น case sensitive
filename ดังนั้น เราอาจจะเลือกใช้ -iname แทน -name เมื่อไม่สนใจ case
ก็ได้ เช่น find /home -name "*.c" จะแสดงทั้ง test.c และ test.C เป็นต้น
นอกจากนี้ยังมี -lname และ -ilname สำหรับกรณีการค้นหา file ที่เป็น
symbolic link ด้วย (สำหรับผู้ที่ไม่คุ้นเคย symbolic link คือการสร้าง
file ที่ใช้/อ้างอิงไปยังไฟล์อื่น คล้ายกับ short-cut ของ windows)
นอกจากนี้ ยังมีการใส่เงื่อนไขให้ค้นหาตามวันที่ -[acm]time
+/-n (n คือจำนวนวัน) เช่น find /home -atime +5
(ในรายละเอียด -atime หมายถึง มีการอ่าน access, -ctime
หมายถึงมีการเปลี่ยนสถานะ -mtime หมายถึง มีการแก้ไข)
หมายถึงหาไฟล์ที่มีการอ่านมาแล้วเกิน 5 วัน หรือถ้า find /home -atime -5
หายถึงหาไฟล์ที่มีการอ่านภายใน 5 วันที่ผ่านมา เป็นต้น
ซึ่งเราสามารถนำไปประยุกต์ใช้ในการ backup ข้อมูลได้ด้วย
กรณีที่ต้องการหาละเอียดเป็นหน่วยนาที ให้เปลี่ยนจาก -atime เป็น -amin
เช่น find /home -amin +5 -amin -7
หมายถึงค้นหาไฟล์ที่มีการอ่านระหว่าง 5 ถึง 7 นาทีก่อนเป็นต้น
(ในทำนองเดียวกัน -amin หมายถึงมีการอ่าน access, -cmin
หมายถึงมีการเปลี่ยนสถานะ, -mmin หมายถึงมีการแก้ไข)
เราอาจจะเปรียบเทียบวันที่กับไฟล์ที่มีอยู่แล้วก็ได้ เช่น find /home
-newer /bin/sh จะหาไฟล์ที่ใหม่กว่า /bin/sh เป็นต้น (ในทำนองเดียวกันมี
-anewer และ -cnewer เช่นกัน) หรือ find /home -used 5
ใช้ค้นหายไฟล์ที่มีการ access นานเกิน 5
วันจากการเปลี่ยนสถานนะครั้งสุดท้าย
นอกจากนี้เรายังสามารถหาตามขนาด โดยการใช้ -size ช่วยก็ได้ เช่น find
/home -size 5k จะหาไฟล์ที่มีขนาด 5 k (โดยประมาณ) หรือใช้ -empty
เพื่อหาไฟล์ที่มีขนาดเป็น 0
การหาไฟล์ตาม type เช่น หาเฉพาะ directory ก็ระบุ -type d (ในรายละเอียด
type อาจะ เป็น b - block device, c - character device, d - directory, p
- named pipe, f - regular file, l - symbolic link, s - socket หรือ D -
door ใน Solaris) เป็นต้น นอกจากนี้เรายังใช้ -xtype หรือดูว่าเป็น link
ไปยัง type ที่ต้องการก็ได้
การหาไฟล์ตามเจ้าของ หรือ กลุ่มเจ้าของ ใช้ -user uname และ -group gname
เช่นเรารู้ว่ามี hacker เข้ามาในระบบในชื่อ nobody เราอาจหาได้ว่า
มีไฟล์ได้บ้างที่ nobody สร้างทิ้งไว้ โดยใช้ find / -user nobody เป็นต้น
(หรือจะใช้ -uid กับ -gid ซึ่งสามารถหาเป็นช่วงของ user id/ group id
ก็ได้)
การหาไฟล์ตาม permission ใช้ -perm mode เช่น find ./ -perm 777 คือหาไฟล์ที่มี permission เป็น 777 เป็นต้น
ค้นหา content ของข้อมูล
หลังจากเรียนรู้เรื่องการใช้ find มาพอควร คราวนี้ลองนำมาผสมกับ xargs และ
grep เพื่อใช้หา string ภายในดูบ้าง ปกติแล้ว grep จะให้หา string
matching เช่น grep -l printf *.c จะหาทุกไฟล์ใน directory
ปัจจุบันที่ลงท้ายด้วย .c และมี printf อยู่ -l
เป็นการระบุให้แสดงชื่อไฟล์เท่านั้น
(หากต้องการแสดงรายละเอียดของบรรทัดที่มี printf ด้วย ก็ไม่ต้องระบุ -l
ก็ได้
คราวนี้ เราจะบอกว่าเราต้องการหาไฟล์ทั้งหมดใน /home ที่ลงท้ายด้วย .c
และมีคำว่า printf เราจะนำ find มาผสมกับ grep โดยใช้ xargs เป็นตัวเชื่อม
ดังนี้
find ./ -name "*.c" | xargs grep -l printf
xargs จะเอาผลลัพธ์ที่ได้จาก find มาใส่เป็น input ให้กับ command line
ของ grep -l printf ดังนั้น เราจะค้นหารายละเอียดได้ในทุกไฟล์ที่ find
แสดงผลลัพธ์ออกมา
นอกจากนี้ ยังมี grep -e เพื่อค้นหาเป็น regular express หรือ grep -i
เพื่อค้นหาแบบไม่สนใจ case อีกด้วย รายละเอียดเพิ่มเติมสามารถศึกษาได้จาก
grep man page (คำสั่ง man grep)
สรุป
สุดท้ายนี้ หวังว่าท่านผู้อ่าน คงจะได้เรียนรู้เรื่องการค้นหาข้อมูลบน unix กันบ้าง ไม่มากก็น้อย
ที่มา:
- find man page
- find info page
| Comment1 |
อืมม
จะลองดูครับ
แต่ยัง งงๆ มือใหม่น่ะครับ |
| From:jojo <folurish_dev< at >hotmail.com> | Date: 2006-08-13 02:02:54 |
| Comment2 |
ขอบคุณครับ man page ของ linux มันเป็นภาษาอังกฤษ
อย่างผมใช้ก็ดูแต่ตัวอย่างแล้วทำตามเท่านั้น
ไม่เคยทราบเลยว่าทำคำสั่งแบบนี้ได้ด้วยครับ
ขอบคุณมากครับ |
| From:sang <> | Date: 2006-12-08 14:54:26 |