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

ประกาศแอฟฟิลิเอต Ver 3.1
ประกาศแอฟฟิลิเอต Ver 3.2 (เฉพาะมือถือ)
สภาพแวดล้อมทดสอบตระกูล RHELAlmaLinux 9.8บัญชี rootตรวจสอบ 2026-10-07
คำสั่งค้นหาwhichwhereislocate

บางครั้งจะแก้ 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.gz

locate แสดงทุกพาธที่ตรงกับชื่อแม้เพียงบางส่วน ถ้าพิมพ์ [locate httpd.conf] จึงได้ทั้งไฟล์ตั้งค่า คู่มือ (httpd.conf.5.gz) และสำเนาที่สำรองไว้ด้วย

ในเซิร์ฟเวอร์เสมือนด้านล่าง เมื่อเลือก which · whereis · locate ทางซ้าย ชิปจะเปลี่ยนไป และเมื่อกดชิป คำสั่งนั้นจะถูกพิมพ์ให้ จะพิมพ์เองด้วยคีย์บอร์ดก็ได้

ตัวจำลองคำสั่งตรวจสอบตำแหน่งAlmaLinux 9.8
[root@server work]#
ทำงานเฉพาะในเบราว์เซอร์และไม่แตะต้องเซิร์ฟเวอร์จริง เลือกคำสั่งทางซ้ายแล้วชิปด้านล่างจะเปลี่ยนไป กดชิปเพื่อพิมพ์คำสั่งนั้น ลองหา httpd ตัวเดียวกันด้วยทั้ง 3 คำสั่งแล้วเปรียบเทียบผล และใน locate ให้สร้างไฟล์ใหม่แล้วลองหาก่อนและหลัง updatedb ถ้าสับสนให้กด [Start over] และพิมพ์ uknew help เพื่อดูคำสั่งที่ใช้ได้

ถ้าจะหาไฟล์จากขนาดหรือวันที่แก้ไขแทนชื่อ ให้ใช้ คำสั่ง 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.txt

PRUNEPATHS ใน /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$”

ℹ️ ประกาศเรื่องลิงก์แอฟฟิลิเอต
เนื้อหาของเว็บไซต์นี้มีลิงก์แอฟฟิลิเอต หากผู้เข้าชมซื้อสินค้าหรือบริการผ่านลิงก์เหล่านี้ เว็บไซต์นี้จะได้รับค่าคอมมิชชันจากผู้ขาย ในกระบวนการนี้ ราคาที่ผู้ซื้อจ่าย(ราคาจะลดลงเมื่อมีโปรโมชัน↓)จะไม่สูงขึ้นแต่อย่างใด ราคา ส่วนลด และข้อมูลสต็อกที่แสดงเป็นข้อมูล ณ เวลาที่เขียนและอาจต่างจากความเป็นจริง โปรดตรวจสอบกับผู้ขายอีกครั้งก่อนซื้อ การเลือกและการประเมินสินค้าเขียนตามเกณฑ์ของเราเอง และการได้รับค่าคอมมิชชันหรือไม่ไม่มีผลต่อลำดับการแนะนำหรือเนื้อหาการประเมิน

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *

Prove your humanity: 10   +   10   =