บทความนี้อธิบายคำสั่ง find ใน Linux พร้อม Shortcut ตำแหน่งค้นหา Expression ตัวอย่างการใช้งาน Pattern การส่งผลลัพธ์ไปยังไฟล์ และการค้นหาแล้วรันคำสั่งกับไฟล์ที่เจอ
ใช้คำสั่ง 'find' ค้นหาไฟล์ใน Linux
คำสั่งที่ใช้ค้นหาไฟล์คือ find
ไวยากรณ์พื้นฐานของ find:
find [path] [expression] [filename]
Path ปัจจุบันเป็นตำแหน่งค้นหาเริ่มต้น ค้นหาทั้งดิสก์ ใช้:
find / -name "filename"
ค้นหาในโฟลเดอร์ปัจจุบัน ใช้:
find . -name "filename"
เมื่อค้นหาตามชื่อทั่วดิสก์ ใช้ไวยากรณ์:
- ส่วนแรก: คำสั่ง find
- ส่วนที่สอง: ตำแหน่งเริ่มค้นหา
- ส่วนที่สาม: Expression กำหนดสิ่งที่ต้องการค้นหา
- ส่วนสุดท้าย: ชื่อไฟล์ที่ต้องการ
เพื่อเข้าถึง Shell (Terminal) ในส่วนใหญ่ของ Distribution ให้คลิกไอคอนที่เกี่ยวข้อง หรือกด Ctrl+Alt+T
Shortcut ตำแหน่งค้นหา (Search Location Shortcuts)
อาร์กิวเมนต์แรกหลัง find คือตำแหน่งที่ต้องการค้นหา แม้จะระบุไดเรกทอรีเฉพาะได้ แต่สามารถใช้ Metacharacter แทนได้ 3 ตัวที่ใช้กับคำสั่งนี้:
- Period (.): ไดเรกทอรีปัจจุบันและซับไดเรกทอรีทั้งหมด
- Forward Slash (/): ระบบไฟล์ทั้งหมด
- Tilde (~): ไดเรกทอรี Home ของผู้ใช้งานปัจจุบัน
การค้นหาทั้งระบบไฟล์อาจเกิด Error "Access Denied" ใช้ sudo เพื่อรันด้วยสิทธิ์สูง หากต้องเข้าถึงพื้นที่ที่บัญชีปกติไม่สามารถเข้าได้
Expressions ที่ใช้ได้
Expression ที่ใช้บ่อยที่สุดคือ -name ค้นหาชื่อไฟล์หรือโฟลเดอร์
Expression อื่นๆ ที่ใช้ได้:
- -amin n: ไฟล์ถูกเข้าถึงล่าสุด +/- n นาที (ขึ้นอยู่กับรูปแบบเวลา)
- -anewer: ใช้ไฟล์อ้างอิง ค้นหาไฟล์ที่ถูกเข้าถึงใหม่กว่าไฟล์อ้างอิง
- -atime n: ไฟล์ถูกเข้าถึงมากกว่า/น้อยกว่า n วัน
- -cmin n: ไฟล์ถูกเปลี่ยนแปลง n นาทีที่แล้ว
- -cnewer: ใช้ไฟล์อ้างอิง ค้นหาไฟล์ที่เปลี่ยนแปลงใหม่กว่า
- -ctime n: ไฟล์ถูกเปลี่ยนแปลงมากกว่า/น้อยกว่า n วัน
- -empty: ไฟล์ว่างเปล่า
- -executable: ไฟล์สามารถรันได้
- -false: เท็จเสมอ
- -fstype type: ไฟล์อยู่บนระบบไฟล์ที่ระบุ
- -gid n: ไฟล์เป็นของกลุ่ม ID n
- -group groupname: ไฟล์เป็นของกลุ่มที่ระบุ
- -ilname pattern: ค้นหา Symbolic Link ไม่สนใจตัวพิมพ์เล็ก/ใหญ่
- -iname pattern: ค้นหาไฟล์ ไม่สนใจตัวพิมพ์เล็ก/ใหญ่
- -inum n: ค้นหาไฟล์ด้วย Inode ที่ระบุ
- -ipath path: ค้นหา Path ไม่สนใจตัวพิมพ์เล็ก/ใหญ่
- -iregex expression: ค้นหา Regular Expression ไม่สนใจตัวพิมพ์เล็ก/ใหญ่
- -links n: ค้นหาไฟล์ด้วยจำนวน Links ที่ระบุ
- -lname name: ค้นหา Symbolic Link
- -mmin n: ไฟล์ถูกแก้ไข +/- n นาที
- -mtime n: ไฟล์ถูกแก้ไขมากกว่า/น้อยกว่า n วัน
- -name name: ค้นหาไฟล์ด้วยชื่อที่ระบุ
- -newer name: ค้นหาไฟล์ที่แก้ไขใหม่กว่าไฟล์อ้างอิง
- -nogroup: ค้นหาไฟล์ที่ไม่มี Group ID
- -nouser: ค้นหาไฟล์ที่ไม่มี User ผูกมัด
- -path path: ค้นหา Path
- -readable: ค้นหาไฟล์ที่อ่านได้
- -regex pattern: ค้นหาไฟล์ตรง Regular Expression
- -type type: ค้นหาตามประเภท: -type d (Directory), -type f (File), -type l (Symlink)
- -uid uid: User ID ตรงกับที่ระบุ
- -user name: ไฟล์เป็นของผู้ใช้ที่ระบุ
- -writable: ค้นหาไฟล์ที่เขียนได้
ตัวอย่างการใช้งาน Find
ค้นหาไฟล์ที่ถูกเข้าถึงมากกว่าจำนวนวันที่กำหนด
หาไฟล์ทั้งหมดใน Home Folder ที่ถูกเข้าถึงมากกว่า 100 วัน:
find ~ -atime +100
ค้นหาไฟล์และโฟลเดอร์ว่างเปล่า
หาไฟล์และโฟลเดอร์ว่างทั้งหมดในระบบ:
find / -empty
ค้นหาไฟล์ที่รันได้ (Executable) ทั้งหมด
หาไฟล์ Executable ทั้งหมดในคอมพิวเตอร์:
find / -executable -type f
ค้นหาไฟล์ที่อ่านได้ (Readable) ทั้งหมด
หาไฟล์ที่อ่านได้ทั้งหมด:
find / -readable -type f
ใช้ Pattern ค้นหาไฟล์
ค้นหาไฟล์ด้วย Pattern เช่น หาไฟล์ทุกไฟล์ที่มีนามสกุล MP3:
find / -name "*.mp3"
ขึ้นอยู่กับ Shell ที่ใช้ อาจต้อง Escape Asterisk หากรันแล้วไม่ได้ผลลัพธ์ที่คาดหวัง ให้ Quote Pattern ทั้งหมด: find / -name '*.mp3'
ส่งผลลัพธ์ Find ไปยังไฟล์
ปัญหาของ find คืออาจคืนผลลัพธ์มากเกินไป ให้ Pipe ไปยัง tail หรือเขียนลงไฟล์:
find / -name "*.log" > logfiles.txt
ค้นหาและรันคำสั่งกับไฟล์ (Find and Execute)
เพื่อค้นหาและแก้ไขไฟล์พร้อมกัน:
find / -name "filename" -exec nano {} \;
คำสั่งนี้ค้นหาไฟล์ชื่อ filename แล้วรัน Editor nano กับไฟล์ที่เจอ
Nano คือชื่อคำสั่ง Editor ไม่ใช่ส่วนหนึ่งของไวยากรณ์