Tuesday, May 26, 2009

การค้นหา file บน Linux (คำสั่ง find) #1

การค้นหา ไฟล์ใน linux สามารถทำได้หลายวิธีด้วยกันในหัวข้อนี้จะกล่าวถึงการค้นหาไฟล์โดยใช้เครื่อง มือ find คำสั่ง find เป็นคำสั่งที่ได้รับความนิยมในการใช้งานมากเพราะว่าใช้งานง่ายแต่ว่าจริงๆ แล้วคำสั่งนี้มี parameter มากมายถ้า เราเรียนรู้การใช้งาน parameter เหล่านั้นและใช้งานได้อย่างคล่องแคล่วแล้วล่ะก็เครื่องมือ find ก็ถือได้ว่าเป็นเครื่องมือที่เยี่ยมที่สุดสำหรับการค้นหาไฟล์ เราสามารถใช้คำสั่ง find แบบง่าย ได้เช่น

$ find /home/tophy -name 'index*'
$ find /home/tophy -iname 'index*'

คำสั่งข้างบนจะเป็นการค้นหาไฟล์ที่อยู่ใน directory /home/tophy และ subdirectory
คำสั่งแรกจะใช้ parameter -name เพื่อระบุชื่อไฟล์และตามด้วย 'index*' ซึ่งหมายความว่าเป็นไฟล์ใดๆ ที่ขึ้นต้นด้วยคำว่า index
คำสั่งที่ 2 จะคล้ายกับคำสั่งแรกแต่จะใช้ parameter -iname ซึ่งเป็นการไม่สนใจตัวอักษรเล็กหรือใหญ่ (non-case sensitive) เช่น ชื่อไฟล์ที่ขึ้นต้นด้วย Index, inDex, INDEX เป็นต้น

$ find /home/tophy -name 'index*' 2>/dev/null

คำสั่งด้านบนจะคล้ายกับตัวอย่างก่อนหน้าแต่จะเพิ่มในส่วน 2>/dev/null ซึ่งหมายความว่าระหว่างการค้นหาถ้ามี error message เกิดขึ้นจะนำ error message ไปใส่ไว้ใน /dev/null ซึ่งเป็นอุปกรณ์ที่ไม่ว่าจะใส่อะไรเขาไปสิ่งนั้นก็จะหายไป ถ้าเราต้องการดู error message ทำได้โดยเปลี่ยนจาก /dev/null เป็นชื่อไฟล์ใดๆ ไว้เก็บ error message ปัญหาที่อาจะะเกิดขึ้นได้ เช่น ผู้ใช้ไม่ได้เป็น root แต่ find ในส่วนของ root

$ find -name met*

รูปแบบคำสั่งแบบนี้จะไม่ระบุ path เหมือนคำสั่งก่อนหน้าซึ่งหมายความว่าให้ค้นหาไฟล์ที่ขึ้นต้นด้วยคำว่า met จาก directory ปัจจุบันและ subdirectory จากคำสั่งข้างต้นสามารถนำมาประยุกต์ได้ เช่น

find . -print
find .
find

คำสั่งทั้ง 3 จะเป็นการแสดงรายชื่อไฟล์ทั้งหมดที่อยู่ใน directory ปัจจุบัน

$ find / -name '*.mp3' -size -5000k
$ find / -size +10000k

คำสั่งแรกจะค้นหาจากตำแหน่ง / โดยค้นหาไฟล์ที่ลงท้ายด้วย .mp3 และมีการกำหนด parameter -size เข้าไปเพื่อระบุว่าค้นหาไฟล์ที่มีขนาดน้อยกว่า 5MB (-5000k)
คำสั่งที่ 2 จะคล้ายคำสั่งแรกแต่จะเป็นการค้นหาไฟล์ใดๆ ก็ได้ที่มีขนาดไฟล์มากกว่า 10MB (+10000k)

$ find /home/tophy -amin -10 -name '*.c'
$ find /home/tophy -atime -2 -name '*.c'
$ find /home/tophy -mmin -10 -name '*.c'
$ find /home/tophy -mtime -2 -name '*.c'

คำสั่งแรกจะค้นหาไฟล์จากตำแหน่ง /home/tophy ชื่อไฟล์ที่ลงท้ายด้วย .c ที่ access ไปเมื่อ 10 นาทีที่แล้ว
คำสั่งที่ 2 คล้ายกับคำสั่งแรกจะต่างที่เวลาที่ access จะเป็นช่วง (2-1)*24-2*24 ชม. นั่นก็คือ 24-48 ชม.
คำสั่งที่ 3 คล้ายกับคำสั่งแรกแต่จะค้นหาไฟล์ที่มีการ modified เมื่อ 10 นาทีที่แล้ว
คำสั่งที่ 4 คล้ายกับคำสั่งแรกแต่จะค้นหาไฟล์ที่มีการ modified เป็นช่วง (2-1)*24-2*24 ชม. นั่นก็คือ 24-48 ชม.
ระบบการนับทั้ง atime และ mtime ถ้าเราใส่ค่า 0 หรือ -1 จะหมายถึงเวลาภายใน 24 ชม.

$ find / -name 'Claymore*' -and -size +10000k
$ find / -size +10000k ! -name "Claymore*"
$ find / -name 'Claymore*' -or -size +10000k

คำสั่งทั้ง 3 เป็นการประยุกต์ใช้ boolean operator มาช่วยในการค้นหาไฟล์
คำสั่งแรก ค้นหาไฟล์เริ่มที่ตำแหน่ง / ที่ขึ้นต้นด้วยคำว่า Claymore และขนาดไฟล์มากกว่า 10MB
คำสั่งที่ 2 ค้นหาไฟล์เริ่มที่ตำแหน่ง / ที่มีขนาดไฟล์มากกว่า 10MB และต้องเป็นไฟล์ที่ไม่ได้ขึ้นต้นด้วยคำว่า Claymore
คำสั่งที่ 3 ค้นหาไฟล์เริ่มที่ตำแหน่ง / ที่ขึ้นต้นด้วยคำว่า Claymore หรือไฟล์ใดๆ ที่มีขนาดมากกว่า 10MB

$ find / - name 'Claymore*' -exec ls -l

รูปแบบคำสั่งแบบสุดท้ายจะมีความหลากหลายมากขึ้นประสิทธิภาพของการค้นหาจะขึ้นอยู่กับการนำไปประยุกต์ของผู้ใช้ parameter ของคำสั่งนี้คือ -exec ซึ่งค่าตามหลังจะเป็นคำสั่งที่ทำงานหลังจากคำสั่ง find ด้านหน้าทำงานเสร็จสิ้น ในตัวอย่างจะเป็นการหาไฟล์ที่ขึ้นต้นด้วยคำว่า Claymore เริ่มที่ตำแหน่ง / จากนั้นนำผลลัพธ์ที่ได้มาแสดงผลโดยโชว์รายละเอียดของไฟล์ด้วยคำสั่ง ls -l
นอกจากวิธีการจากตัวอย่างทั้งหมดแล้วการใช้ find ยังมี parameter อีกหลายตัวที่มีความซับซ้อนและต้องทำความเข้าใจอีกมาก เช่น

-regex ใช้ regular expression ช่วยในการค้นหา
-iregex เหมือนกับคำสั่งด้านบนแต่เป็น non-case sensitive
-empty ค้นหาไฟล์หรือ directory ที่ว่างเปล่า
-type ค้นหาตามประเภทของไฟล์
-user ค้นหาไฟล์ที่มีเจ้าของเป็น user ที่ต้องการ
-group ค้นหาไฟล์ตาม group ที่ต้องการ

credit:http://www.codecoffee.com/tipsforlinux/articles/21.html,
http://www.secguru.com

ref: http://top85.spaces.live.com/blog/cns!D84A636C1EFDB724!229.entry

No comments:

Post a Comment