คำสั่ง which, whereis, locate ของ Linux: 3 คำสั่งตรวจสอบตำแหน่ง (พาธ)

บางครั้งจะแก้ httpd.conf แต่ไม่รู้ว่าไฟล์อยู่ที่ไหน หรือมีคำสั่งชื่อเดียวกันอยู่ 2 ที่จนสับสนว่าตัวไหนถูกรัน คำสั่ง which ของ Linux หาไฟล์ที่ถูกรันจริง คำสั่ง whereis ของ Linux หาไฟล์ที่รันได้พร้อมโฟลเดอร์ตั้งค่า · คู่มือ ส่วนคำสั่ง locate หาทุกพาธที่มีชื่อนั้นอยู่ บทความนี้เปรียบเทียบความต่างของทั้ง 3 คำสั่งในตาราง และให้ลองพิมพ์เองบนเซิร์ฟเวอร์เสมือนในเบราว์เซอร์
ใน AlmaLinux 9.8 which อยู่ในแพ็กเกจ which 2.21 และ whereis อยู่ในแพ็กเกจ util-linux 2.37.4 จึงใช้ได้ตั้งแต่แรก ส่วน locate ต้องติดตั้งแพ็กเกจ mlocate 0.26 แยกต่างหาก
✅ ความแตกต่างของ which · whereis · locate
ทั้ง 3 คำสั่งค้นหาในที่ต่างกัน which และ whereis ค้นโฟลเดอร์ที่กำหนดไว้ทันทีที่สั่ง ส่วน locate หาชื่อจากรายการไฟล์ (DB) ที่สร้างไว้ล่วงหน้า
| คำสั่ง | สิ่งที่หา | ตำแหน่งที่ค้น | ไฟล์ที่สร้างใหม่ |
|---|---|---|---|
| which | ไฟล์คำสั่งที่ถูกรัน 1 ไฟล์ และชื่อแทน (alias) | โฟลเดอร์ที่อยู่ใน PATH | เจอทันที |
| whereis | ไฟล์ที่รันได้ · โฟลเดอร์ตั้งค่า · คู่มือ | โฟลเดอร์ที่กำหนดไว้ เช่น /usr/bin · /etc · /usr/share/man | เจอทันที |
| locate | ทุกไฟล์และโฟลเดอร์ที่มีชื่อนั้น | DB ที่สร้างไว้ล่วงหน้า (/var/lib/mlocate/mlocate.db) | เจอหลัง updatedb |
ถ้าหา httpd ตัวเดียวกันด้วย which และ whereis จะเห็นความต่างทันที
~]# which httpd
/usr/sbin/httpd
~]# whereis httpd
httpd: /usr/sbin/httpd /usr/lib64/httpd /etc/httpd /usr/share/httpd /usr/share/man/man8/httpd.8.gzlocate แสดงทุกพาธที่ตรงกับชื่อแม้เพียงบางส่วน ถ้าพิมพ์ [locate httpd.conf] จึงได้ทั้งไฟล์ตั้งค่า คู่มือ (httpd.conf.5.gz) และสำเนาที่สำรองไว้ด้วย
ในเซิร์ฟเวอร์เสมือนด้านล่าง เมื่อเลือก which · whereis · locate ทางซ้าย ชิปจะเปลี่ยนไป และเมื่อกดชิป คำสั่งนั้นจะถูกพิมพ์ให้ จะพิมพ์เองด้วยคีย์บอร์ดก็ได้
ถ้าจะหาไฟล์จากขนาดหรือวันที่แก้ไขแทนชื่อ ให้ใช้ คำสั่ง find ส่วนพาธของโฟลเดอร์ที่อยู่ตอนนี้ ให้ใช้ คำสั่ง pwd ตรวจสอบ
✅ คำสั่ง which ของ Linux
which ค้นโฟลเดอร์ใน PATH ทีละโฟลเดอร์ตั้งแต่ตัวแรก แล้วแสดงไฟล์ที่รันได้ไฟล์แรกที่เจอ นี่คือไฟล์ที่ถูกรันจริงเมื่อพิมพ์คำสั่ง
bash ของ AlmaLinux ส่งรายการ alias ให้ which ด้วย คำสั่งที่มี alias จึงแสดงทั้ง alias และไฟล์จริง ถ้าไม่มีอยู่ใน PATH เลย จะได้ [no ชื่อคำสั่ง in (PATH)]
~]# which ll
alias ll='ls -l --color=auto'
/usr/bin/ls
~]# which htop
/usr/bin/which: no htop in (/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin)ในทางปฏิบัติมีตัวเลือกเดียวคือ -a ใช้แสดงทั้งหมดเมื่อมีชื่อเดียวกันอยู่ใน 2 โฟลเดอร์ของ PATH และตัวที่อยู่บนสุดคือตัวที่ถูกรันจริง
~]# which ping
/usr/sbin/ping
~]# which -a ping
/usr/sbin/ping
/usr/bin/pingใน AlmaLinux 9.8 /usr/sbin/ping เป็นลิงก์ที่ชี้ไปยัง /usr/bin/ping ผลจึงเหมือนกัน ถ้าโปรแกรมที่ติดตั้งเองอยู่ใน /usr/local/bin จะถูกรันก่อนตัวใน /usr/bin ตามลำดับของ PATH
[which cd] แสดง /usr/bin/cd แต่เมื่อพิมพ์ cd ในเชลล์ สิ่งที่ถูกรันคือคำสั่งในตัวของเชลล์ (builtin) ไม่ใช่ไฟล์นี้ ตรวจว่าเป็นคำสั่งในตัวหรือไม่ได้ด้วย [type cd] ซึ่งจะแสดง [cd is a shell builtin]
✅ คำสั่ง whereis ของ Linux
whereis ใช้ชื่อคำสั่งหาไฟล์ที่รันได้และคู่มือไปพร้อมกัน โดยไม่ขึ้นกับ PATH และค้นในโฟลเดอร์ที่กำหนดไว้ เช่น /usr/bin · /usr/sbin · /usr/lib64 · /etc · /usr/share จึงเจอแม้แต่โฟลเดอร์ตั้งค่าที่ชื่อเดียวกัน (/etc/httpd)
| ตัวเลือก | คำอธิบาย | |
|---|---|---|
| -b | เฉพาะฝั่งไฟล์ที่รันได้ สำหรับ httpd ได้แก่ /usr/sbin/httpd และ /usr/lib64/httpd · /etc/httpd · /usr/share/httpd | |
| -m | เฉพาะคู่มือ (/usr/share/man · /usr/share/info) | |
| -s | เฉพาะซอร์ส ในการติดตั้งพื้นฐานของ AlmaLinux 9.8 จะได้แค่ชื่อ เช่น [httpd:] | |
| -l | รายการโฟลเดอร์ที่ whereis ค้นหา |
~]# whereis -b httpd
httpd: /usr/sbin/httpd /usr/lib64/httpd /etc/httpd /usr/share/httpd
~]# whereis -m httpd
httpd: /usr/share/man/man8/httpd.8.gz
~]# whereis passwd
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1ossl.gz /usr/share/man/man1/passwd.1.gzถ้าไม่เจออะไรจะได้แค่ชื่อ เช่น [htop:] เมื่อหาไม่เจอ which จะคืนค่า exit code 1 ส่วน whereis คืนค่า 0 ดังนั้นเวลาตรวจในสคริปต์ว่าติดตั้งแล้วหรือยัง ให้ใช้ which
✅ คำสั่ง locate ของ Linux
locate ไม่ได้ค้นในดิสก์ แต่หาชื่อจาก DB ที่สร้างไว้ล่วงหน้า จึงเร็ว แต่หาไฟล์ที่เกิดขึ้นหลังสร้าง DB ไม่เจอ
~]# dnf -y install mlocate
~]# updatedbถ้าพิมพ์ทันทีหลังติดตั้ง จะยังไม่มี DB และได้ [locate: can not stat () `/var/lib/mlocate/mlocate.db’: No such file or directory] เมื่อรัน updatedb หนึ่งครั้ง DB จะถูกสร้างขึ้น หลังจากนั้น mlocate-updatedb.timer จะสร้าง DB ใหม่วันละครั้ง
ไฟล์ที่สร้างใหม่จะไม่แสดงก่อน updatedb และไฟล์ที่ลบไปแล้วจะยังแสดงอยู่จนกว่าจะ updatedb ถ้าจะดูเฉพาะไฟล์ที่มีอยู่ตอนนี้ ให้ใส่ -e
~]# touch report.txt
~]# locate report.txt
~]# updatedb
~]# locate report.txt
/root/work/report.txt
~]# rm -f report.txt
~]# locate report.txt
/root/work/report.txt
~]# locate -e report.txtPRUNEPATHS ใน /etc/updatedb.conf มี /tmp · /var/tmp · /mnt · /media อยู่ ไฟล์ในโฟลเดอร์เหล่านี้จึงไม่แสดงแม้จะรัน updatedb แล้ว
🔲 ตัวเลือกคำสั่ง locate
| ตัวเลือก | คำอธิบาย | |
|---|---|---|
| -i | ค้นหาโดยไม่สนตัวพิมพ์ใหญ่·เล็ก | |
| -c | แสดงแค่จำนวนที่เจอแทนพาธ | |
| -l= -n | ใส่ตัวเลขต่อท้ายเพื่อแสดงไม่เกินจำนวนนั้น เช่น -l 3 | |
| -b | ค้นเฉพาะชื่อไฟล์ที่ท้ายพาธ | |
| -e | ตัดไฟล์ที่ตอนนี้ไม่มีแล้วออก แม้จะยังอยู่ใน DB | |
| -S | ข้อมูล DB (จำนวนโฟลเดอร์ · จำนวนไฟล์ · ขนาด) | |
| -r | ค้นด้วย Regex เช่น locate -r “httpd.conf$” |
ℹ️ ประกาศเรื่องลิงก์แอฟฟิลิเอต
เนื้อหาของเว็บไซต์นี้มีลิงก์แอฟฟิลิเอต หากผู้เข้าชมซื้อสินค้าหรือบริการผ่านลิงก์เหล่านี้ เว็บไซต์นี้จะได้รับค่าคอมมิชชันจากผู้ขาย ในกระบวนการนี้ ราคาที่ผู้ซื้อจ่าย(ราคาจะลดลงเมื่อมีโปรโมชัน↓)จะไม่สูงขึ้นแต่อย่างใด ราคา ส่วนลด และข้อมูลสต็อกที่แสดงเป็นข้อมูล ณ เวลาที่เขียนและอาจต่างจากความเป็นจริง โปรดตรวจสอบกับผู้ขายอีกครั้งก่อนซื้อ การเลือกและการประเมินสินค้าเขียนตามเกณฑ์ของเราเอง และการได้รับค่าคอมมิชชันหรือไม่ไม่มีผลต่อลำดับการแนะนำหรือเนื้อหาการประเมิน