คุณรู้ไหมว่าการติดตั้ง Linux ใหม่มีไฟล์กี่ไฟล์? หากใช้ PopOS! เป็นตัวอย่าง มีไฟล์มากกว่า 31,000 ไฟล์ นั่นก่อนที่คุณจะเริ่มสร้างเอกสาร จัดเก็บเพลง ดาวน์โหลด PDF หรือจัดระเบียบรูปภาพ
เพราะฉะนั้น การค้นหาไฟล์หรือโฟลเดอร์ที่ถูกต้องใน Linux เมื่อคุณต้องการจึงกลายเป็นความท้าทาย ในบทความนี้ คุณจะได้เรียนรู้วิธีใช้คำสั่ง FIND ของ Linux และเราจะให้ตัวอย่างให้มากที่สุดเท่าที่จะทำได้
ไวยากรณ์คำสั่ง FIND ของ Linux
ไวยากรณ์หมายถึงวิธีที่คำหรือคำสั่งถูกนำมารวมกัน เช่นเดียวกับประโยคทั่วไปที่สามารถกลายเป็นไร้เหตุผลได้โดยการสลับคำ คำสั่งก็อาจล้มเหลวหากไม่ได้ใช้ในไวยากรณ์ที่ถูกต้อง
find [path] [conditions] [actions]
นี่คือความหมาย:
- find – เริ่มต้นยูทิลิตี Find ใน Linux
- path – ที่จะค้นหา
- conditions – อาร์กิวเมนต์ที่คุณต้องการนำไปใช้กับการค้นหา
- actions – สิ่งที่คุณต้องการทำกับผลลัพธ์
ตัวอย่างง่ายๆ ที่ใช้ทั้งสามอย่าง:
find . -name file-sample.rtf -print
ตามที่คุณคาดการณ์ นี่จะค้นหาชื่อไฟล์ file-sample.rtf
จุด (.) path บอก find ให้ค้นหาในไดเรกทอรีปัจจุบันและไดเรกทอรีย่อยภายใน
-name เงื่อนไข บอก find ให้หาไฟล์ด้วยชื่อเฉพาะนั้น
-print การกระทำ บอก FIND ให้แสดงผลลัพธ์บนหน้าจอ
จุดและ -print เป็นค่าเริ่มต้นของคำสั่ง find ดังนั้นมันจะทำงานเหมือนเดิมแม้คุณจะไม่ใช้ก็ได้ ดังนั้น find -name file-sample.rtf จะให้ผลลัพธ์เหมือนกัน
Linux FIND ในไดเรกทอรีอื่น
คุณสามารถค้นหาในไดเรกทอรีที่ต่างจากที่คุณอยู่ได้ เพียงแทรกพาธไปยังไดเรกทอรีหลัง FIND หากคุณอยู่ที่รูทและรู้ว่าไฟล์อยู่ในไดเรกทอรี home/user ให้ใช้:
find home/user -name file-sample.rtf
มันยังคงเป็นการค้นหาแบบ recursive ดังนั้นมันจะผ่านทุกไดเรกทอรีภายใต้ user
Linux FIND ค้นหาหลายไดเรกทอรี
หากคุณต้องการค้นหาในหลายไดเรกทอรีพร้อมกัน ให้ระบุลงในคำสั่ง คั่นด้วยช่องว่าง
find /lib /var /bin -name file-sample.rtf
Linux FIND ไม่มี Recursion หรือจำกัด Recursion
หากคุณใช้คำสั่ง FIND ข้างต้นที่ระดับรูท มันจะค้นหาทุกไดเรกทอรีในระบบ ดังนั้นหากคุณต้องการอยู่แค่ไดเรกทอรีปัจจุบัน ให้ใช้ตัวเลือก -maxdepth ตัวเลขหลัง -maxdepth บอก Find ว่าไปลึกแค่ไหนก่อนหยุด
การใช้ -maxdepth 1 หมายถึงแค่ไดเรกทอรีนี้
find -name file-sample.rtf -maxdepth 1
การใช้ -maxdepth 2 หรือตัวเลขมากกว่า หมายถึงไปลึกกว่านั้นตามจำนวนระดับ
find -maxdepth 5 -name file-sample.rtf
ตัวอย่าง Linux FIND Wildcard
คำสั่ง FIND ใช้เครื่องหมายดอกจัน (*) เป็น wildcard ใช้สำหรับส่วนใดของชื่อที่คุณไม่แน่ใจ สามารถใช้ได้มากกว่าหนึ่งครั้งในชื่อ ถ้าไม่มีประเภทไฟล์เป็นส่วนหนึ่งของชื่อไฟล์ ผลลัพธ์จะรวมไดเรกทอรีที่ตรงกันด้วย
find home/user -name file*sample*
ตัวอย่าง Linux FIND ตามประเภท
เพื่อค้นหาเฉพาะไฟล์หรือไดเรกทอรี ให้ใช้ตัวเลือก -type และตัวบ่งชี้ที่เหมาะสม มีหลายตัว แต่ไฟล์และไดเรกทอรีเป็นที่พบบ่อยสุด:
- f – ไฟล์
- d – ไดเรกทอรี
- b – บล็อกอุปกรณ์
- c – ตัวอักษรอุปกรณ์
- l – symbolic link
- s – socket
find home/user -name file*sample* -type d
Linux FIND แบบไม่สนใจตัวพิมพ์ใหญ่เล็ก
ต่างจาก Windows Linux สนใจว่าตัวอักษรเป็นพิมพ์ใหญ่หรือเล็ก ดังนั้นหากคุณต้องการให้ค้นหาทั้ง File-Sample.rtf และ file-sample.rtf ให้ใช้ตัวเลือก -iname
find home/user -iname File-Sample.rtf
ตัวอย่าง Linux FIND หลายไฟล์
สมมติว่าคุณต้องการหาเวอร์ชัน .rtf และ .html ของไฟล์ สามารถทำได้ในคำสั่งเดียวโดยใช้ตัวดำเนินการ -o (หรือ) ในบาง distro คุณอาจต้องใส่ชื่อในวงเล็บ เช่น ( -name file-sample.rtf -o -name file-sample.html )
find home/user -name file-sample.rtf -o -name file-sample.html
Linux FIND ไฟล์ที่ไม่ตรงกับชื่อ
คุณอาจรู้ว่ามีเวอร์ชัน .html ของไฟล์ แต่ไม่แน่ใจว่ามีอีกไหม คุณสามารถกรองเวอร์ชัน .html ออกจากการค้นหาโดยใช้ตัวเลือก -not
find home/user -name file-sample* -not -name *.html
Linux FIND โดยไม่มีผลลัพธ์ข้อผิดพลาด
ในตัวอย่าง find ไม่มี recursion สังเกตว่ามันรายการทุกไดเรกทอรีที่มันค้นหาไม่ได้และผลลัพธ์ที่ถูกต้อง นั่นรบกวน มาหยุดไม่ให้มันแสดงไดเรกทอรี "Permission denied" ทั้งหมด รวมกับคำสั่ง Linux terminal อื่นคือ grep คุณยังสามารถใช้ Find กับ grep เพื่อหาไฟล์ที่มีคำเฉพาะในตัวได้
find -maxdepth 5 -name file-sample.rtf 2>&1 | grep -v "Permission denied"
ลองแยก 2>&1:
- 2 – แทน stderr ซึ่งเป็นข้อผิดพลาดมาตรฐาน
- 1 – แทน stdout ซึ่งเป็นเอาต์พุตมาตรฐาน
- > – หมายถึงการเปลี่ยนทิศทางเอาต์พุตด้านซ้ายไปด้านขวา
- & – หมายถึงการรวมเข้าด้วยกัน
ดังนั้น 2>&1 หมายถึงนำข้อผิดพลาดมาตรฐานเปลี่ยนทิศทาง แล้วรวมเข้ากับเอาต์พุตมาตรฐานเป็นเอาต์พุตเดียว
ตอนนี้ดู | grep -v "Permission denied":
- | (เรียกว่า pipe) – บอก Linux ให้นำผลลัพธ์ด้านซ้ายไปให้ด้านขวา ส่งให้คำสั่ง grep
- grep – เป็นยูทิลิตีค้นหาข้อความ
- -v – บอก grep ให้ค้นหาอะไรที่ไม่ตรงกับข้อความด้านซ้ายของ -v ในกรณีนี้ บอก grep ให้หาเฉพาะสิ่งที่ไม่มีข้อความ "Permission denied" ดังนั้น grep จะแสดงเฉพาะผลลัพธ์ที่คุณต้องการและข้อผิดพลาดที่ไม่ตรงกับ "Permission denied"
ตัวอย่าง Linux FIND ตามสิทธิ์
เพื่อใช้ได้ดี คุณต้องเรียนรู้สิทธิ์ของ Linux
ไฟล์ตัวอย่างทั้งหมดมีสิทธิ์ 664 ยกเว้นอันหนึ่งที่มีสิทธิ์ 775 ใช้ตัวเลือก -perm เพื่อหามัน
find Documents/ -name file-sample* -type f -perm 775
ตัวอย่าง Linux FIND ตามขนาด
การค้นหาไฟล์ตามขนาดมีประโยชน์สำหรับการหาไฟล์ใหญ่ที่เต็มฮาร์ดดิสก์ ใช้ตัวเลือก -size, ขนาดที่ต้องการ, และหน่วยต่อไปนี้ หากไม่ใช้หน่วย -size จะเป็นค่าเริ่มต้น b เพื่อหาไฟล์เท่ากับและใหญ่กว่าขนาดหนึ่ง ให้ใส่เครื่องหมายบวก (+) หน้าขนาด
- M – เมกะไบต์
- G – กิกะไบต์
- k – กิโลไบต์
- b – บล็อก (512 ไบต์ – ค่าเริ่มต้น)
- c – ไบต์
- w – คำ (สองไบต์รวมกัน)
find -size +500k
Linux FIND ตามเจ้าของ
มีสองวิธีค้นหาไฟล์ตามเจ้าของ หนึ่งคือชื่อผู้ใช้ และอีกคือกลุ่มผู้ใช้ เพื่อค้นหาตามชื่อผู้ใช้ ให้ใช้ตัวเลือก -user ตามด้วยชื่อผู้ใช้ เพื่อค้นหาตามกลุ่มผู้ใช้ ให้ใช้ -group ตามด้วยชื่อกลุ่ม
find -user groupname หรือ find -user username
ตัวอย่าง Linux FIND ไฟล์ตามเวลาที่ปรับปรุงล่าสุด
เพื่อหาไฟล์ที่ถูกปรับปรุงหรือแก้ไขใน X วันที่ผ่านมา ใช้ -mtime ตามด้วยตัวเลข การใส่เครื่องหมายลบ (-) หน้าตัวเลขจะหาอะไรที่ถูกเปลี่ยนแปลงภายในวันนั้นก่อนหน้านี้ เครื่องหมายบวก (+) หมายถึงภายในวันนั้นก่อนหน้านี้
find -name "file-sample*" -mtime +5 (มากกว่า 5 วันที่แล้ว)
find -name "file-sample*" -mtime -5 (น้อยกว่า 5 วันที่แล้ว)
เพื่อค้นหาตามเวลาปรับปรุงล่าสุดในหน่วยนาที ให้ใช้ตัวเลือก -mmin ตามด้วยจำนวนนาที ใช้ + และ - เหมือนด้านบน
find -name "file-sample*" -mmin -5
find -name "file-sample*" -mmin +5
ตัวอย่าง Linux FIND ไฟล์ตามเวลาเข้าถึงล่าสุด
ตัวเลือกที่ใช้ค้นหาไฟล์จากเวลาที่เปิดล่าสุดคือ -atime สำหรับวัน และ -amin สำหรับนาที ตามด้วยจำนวนวันหรือนาทีที่ต้องการย้อนกลับ และใช้เครื่องหมาย + และ - เป็นมากกว่าและน้อยกว่า
find -name "file-sample*" -atime -5
find -name "file-sample*" -amin -5
รวม FIND กับคำสั่ง Linux อื่นๆ
มีตัวอย่างด้านบนของการใช้ find กับคำสั่ง grep และคุณสามารถใช้กับคำสั่งอื่นๆ ได้อีกมาก คุณเห็นได้ว่าการใช้ find และคำสั่งอื่นๆ สามารถทรงพลังและประหยัดเวลาได้มาก ทưởng像一下必须删除一堆特定类型的文件。与其在文件资源管理器中四处搜索,只需编写正确的命令,几秒钟就完成了。你现在将如何使用 find 命令?