ค้นหา vs find: การใช้งานข้อดีและข้อเสียของกันและกัน


132

ในระบบ Linux และ Unix มีสองคำสั่งค้นหาร่วมกันและlocatefind

ข้อดีและข้อเสียของแต่ละข้อคืออะไร? เมื่อใดที่มีประโยชน์มากกว่าอีก?


คำตอบ:


166

locate(1)มีข้อได้เปรียบข้อใหญ่เพียงข้อเดียวfind(1): ความเร็ว

find(1)แม้ว่าจะมีหลายข้อได้เปรียบกว่าlocate(1):

  • find(1)เป็นดั่งเดิมจะกลับไปเป็นรุ่นแรกของ AT & T ยูนิกซ์ คุณยังจะพบว่าใน Linuxes ตัดลงฝังตัวผ่าน Busybox มันคือทั้งหมดที่เป็นสากล

    locate(1)อายุน้อยกว่าfind(1)มาก บรรพบุรุษเก่าแก่ที่สุดของlocate(1) ไม่ปรากฏ 1983 จนและมันก็ไม่สามารถใช้ได้อย่างกว้างขวางว่าเป็น " locate" จนกระทั่งปี 1994 เมื่อมันถูกนำมาใช้เข้า findutils GNUและเข้าไปใน 4.4BSD

  • locate(1)ยังไม่เป็นมาตรฐานดังนั้นจึงไม่ได้ติดตั้งตามค่าเริ่มต้นทุกที่ ระบบปฏิบัติการ POSIX บางประเภทไม่ได้เสนอเป็นตัวเลือกและในกรณีที่ใช้งานได้การปรับใช้อาจขาดคุณสมบัติที่คุณต้องการเนื่องจากไม่มีมาตรฐานอิสระระบุชุดคุณลักษณะขั้นต่ำที่ต้องใช้งาน

    มีความเป็นพฤตินัยมาตรฐานเป็นBSDlocate(1)แต่นั่นเป็นเพียงเพราะอีกสองรสชาติหลักของการlocateดำเนินการทั้งหมดของตัวเลือกของ: -0, -c, -d, -i, -l, -m, และ-s ดำเนินการ 6 ตัวเลือกเพิ่มเติมที่ไม่มีใน BSD : , , , , และ GNUดำเนินหกบวกอีกสี่ : , , และ (ฉันไม่สนใจชื่อแทนและความแตกต่างเล็กน้อยเช่นvs vs. )-Smlocatelocate-b-e-P-q--regex-wlocate-A-D-E-p-?-h--help

    BSDsและ Mac OS X เรือ locateBSD

    Linuxes ส่วนใหญ่ส่ง GNU locateแต่ Red Hat Linuxes และ Arch ship mlocateแทน Debian ไม่ได้ติดตั้งในการติดตั้งพื้นฐาน แต่มีทั้งสองเวอร์ชันในที่เก็บแพ็คเกจเริ่มต้น ถ้าทั้งสองมีการติดตั้งในครั้งเดียว " locate" mlocateวิ่ง

    Oracle ได้รับการจัดส่งmlocateใน Solaris ตั้งแต่ 11.2ซึ่งวางจำหน่ายในเดือนธันวาคม 2014 ก่อนหน้านั้นlocateไม่ได้ติดตั้งตามค่าเริ่มต้นบน Solaris (สมมุติว่าสิ่งนี้ทำเพื่อลดความไม่เข้ากันของคำสั่งของ Solaris กับOracle Linuxซึ่งใช้ Red Hat Enterprise Linuxซึ่งใช้mlocateเช่นกัน)

    IBM AIXยังไม่จัดส่งสินค้ารุ่นใด ๆlocate, อย่างน้อยเป็นของ AIX 7.2เว้นแต่คุณจะติดตั้ง GNU findutilsจากAIX กล่องเครื่องมือสำหรับการใช้งานลินุกซ์

    HP-UXก็ดูเหมือนว่าจะขาดlocateในระบบฐาน

    เก่าUnixes "ของจริง"locateโดยทั่วไปไม่ได้รวมถึงการดำเนินการของ

  • find(1)มีไวยากรณ์นิพจน์ที่ทรงพลังพร้อมฟังก์ชันมากมายตัวดำเนินการบูลีนฯลฯ

  • find(1)สามารถเลือกไฟล์ได้มากกว่าชื่อ สามารถเลือกโดย:

    • อายุ
    • ขนาด
    • เจ้าของ
    • ประเภทไฟล์
    • การประทับเวลา
    • สิทธิ์
    • ความลึกภายในทรีย่อย ...
  • เมื่อค้นหาไฟล์โดยใช้ชื่อคุณสามารถค้นหาโดยใช้ไฟล์ไวยากรณ์ globbingในทุกรุ่นของfind(1)หรือ GNU หรือ BSD รุ่นโดยใช้การแสดงผลปกติ

    เวอร์ชันปัจจุบันของlocate(1)รูปแบบการยอมรับ glob เช่นเดียวกับfindแต่ BSD locateไม่ได้ regexes เลย หากคุณชอบฉันและต้องใช้ความหลากหลายของประเภทเครื่องคุณพบว่าตัวเองพอใจgrepการกรองเพื่อการพัฒนาพึ่งพาหรือ-r--regex

    locateต้องการการกรองที่รัดกุมมากกว่าfindเพราะ ...

  • find(1)ไม่จำเป็นต้องค้นหาระบบไฟล์ทั้งหมด โดยทั่วไปคุณจะชี้ไปที่ไดเรกทอรีย่อยซึ่งเป็นพาเรนต์ที่มีไฟล์ทั้งหมดที่คุณต้องการให้ทำงาน พฤติกรรมทั่วไปสำหรับlocate(1)การนำไปใช้คือการคายไฟล์ทั้งหมดที่ตรงกับรูปแบบของคุณทิ้งไว้ในการgrepกรองและเพื่อลดการปะทุลงตามขนาด

    (เคล็ดลับความชั่วร้าย: locate /คุณอาจจะได้รับรายชื่อไฟล์ทั้งหมดในระบบ!)

    มีสายพันธุ์มีความlocate(1)เหมือนslocate(1)ที่ จำกัด การส่งออกขึ้นอยู่กับสิทธิ์ของผู้ใช้ แต่ตอนนี้ไม่ได้เป็นรุ่นเริ่มต้นของlocateในระบบปฏิบัติการใด ๆ ที่สำคัญ

  • find(1)สามารถทำสิ่งต่าง ๆกับไฟล์ที่ค้นพบนอกเหนือจากการค้นหาเพียงอย่างเดียว ผู้ประกอบการดังกล่าวมีประสิทธิภาพมากที่สุดและได้รับการสนับสนุนอย่างกว้างขวาง-execแต่ก็มีบางราย ใน GNU และ BSD ล่าสุดค้นหาการใช้งานตัวอย่างเช่นคุณมี-deleteและ-execdirโอเปอเรเตอร์

  • find(1) ทำงานแบบเรียลไทม์ดังนั้นผลลัพธ์ของมันจะเป็นข้อมูลล่าสุดเสมอ

    เนื่องจากlocate(1)อาศัยฐานข้อมูลชั่วโมงหรือวันที่อัปเดตในอดีตเอาต์พุตของมันจึงล้าสมัย (นี่เป็นปัญหาแคชเก่า ) เหรียญนี้มีสองด้าน:

    1. locate สามารถตั้งชื่อไฟล์ที่ไม่มีอยู่อีกต่อไป

      GNU locateและmlocateมี-eธงที่จะทำให้มันตรวจสอบไฟล์ดำรงอยู่ก่อนที่จะพิมพ์ออกมาชื่อของแต่ละไฟล์ค้นพบในอดีตที่ผ่านมา แต่ตอนนี้กินไปบางส่วนของlocateประโยชน์จากความเร็วและไม่สามารถใช้ได้ใน BSD locateนอกเหนือจาก

    2. locate จะล้มเหลวในการตั้งชื่อไฟล์ที่สร้างขึ้นตั้งแต่การอัพเดทฐานข้อมูลครั้งล่าสุด

    คุณเรียนรู้ที่จะไม่locateมั่นใจในการส่งออกโดยรู้ว่ามันอาจจะผิด

    มีวิธีการแก้ไขปัญหานี้ แต่ฉันไม่ได้ตระหนักถึงการใช้งานอย่างแพร่หลาย ตัวอย่างเช่นมีrlocateแต่ดูเหมือนว่าจะไม่ทำงานกับเคอร์เนล Linux ที่ทันสมัย

  • find(1) ไม่เคยมีสิทธิพิเศษมากกว่าที่ผู้ใช้เรียกใช้

    เนื่องจากlocateให้บริการทั่วโลกแก่ผู้ใช้ทุกคนในระบบจึงต้องการให้updatedbกระบวนการทำงานตามrootเพื่อให้สามารถเห็นระบบไฟล์ทั้งหมด สิ่งนี้นำไปสู่การเลือกปัญหาความปลอดภัย:

    1. เรียกใช้updatedbเป็นรูท แต่ทำให้ไฟล์เอาต์พุตสามารถอ่านได้ทั่วโลกเพื่อให้locateสามารถรันได้โดยไม่มีสิทธิ์พิเศษ นี่เป็นการเปิดเผยชื่อของไฟล์ทั้งหมดในระบบให้กับผู้ใช้ทั้งหมดอย่างมีประสิทธิภาพ นี่อาจเป็นการละเมิดความปลอดภัยที่เพียงพอที่จะทำให้เกิดปัญหาจริง

      BSD ได้locateรับการกำหนดค่าด้วยวิธีนี้ใน Mac OS X และ FreeBSD

    2. เขียนฐานข้อมูลเป็นแบบอ่านได้เท่านั้นrootและสร้างlocate setuidรูทเพื่อให้สามารถอ่านฐานข้อมูลได้ ซึ่งหมายความว่าlocateต้องปรับใช้ระบบการอนุญาตของ OS อีกครั้งอย่างมีประสิทธิภาพดังนั้นจึงไม่แสดงไฟล์ที่คุณไม่สามารถเห็นได้ตามปกติ นอกจากนี้ยังเพิ่มพื้นผิวการโจมตีของระบบของคุณโดยเฉพาะการเสี่ยงต่อการโจมตีที่เพิ่มขึ้น

    3. สร้างlocateผู้ใช้หรือกลุ่มพิเศษเพื่อเป็นเจ้าของไฟล์ฐานข้อมูลและทำเครื่องหมายlocateไบนารีเป็นsetuid/setgidชื่อผู้ใช้ / กลุ่มนั้นเพื่อให้สามารถอ่านฐานข้อมูล สิ่งนี้ไม่ได้ป้องกันการโจมตีการเลื่อนระดับด้วยตัวเอง แต่มันลดความเสียหายที่อาจเกิดขึ้นได้อย่างมาก

      mlocateมีการกำหนดค่าด้วยวิธีนี้ในRed Hat Enterprise Linux

      คุณยังคงมีปัญหาอยู่เพราะถ้าคุณสามารถใช้ดีบักเกอร์locateหรือทำให้การถ่ายโอนข้อมูลหลักคุณจะได้รับในส่วนที่ได้รับการยกเว้นของฐานข้อมูล

    ฉันไม่เห็นวิธีการสร้างlocateคำสั่ง"ปลอดภัย" อย่างแท้จริงโดยขาดการทำงานแยกจากกันสำหรับผู้ใช้แต่ละรายบนระบบซึ่งขัดแย้งกับประโยชน์find(1)มากมาย

บรรทัดล่างทั้งสองมีประโยชน์มาก locate(1)จะดีกว่าเมื่อคุณแค่พยายามค้นหาไฟล์ตามชื่อที่คุณรู้ว่ามีอยู่ แต่คุณจำไม่ได้ว่ามันอยู่ตรงไหน find(1)จะดีกว่าเมื่อคุณมีพื้นที่โฟกัสเพื่อทำการตรวจสอบหรือเมื่อคุณต้องการข้อได้เปรียบมากมาย


ขออภัยฉันมองข้ามย่อหน้า "จัดสรร" rlocate แก้ไขปัญหาแคชเก่า คุณอาจต้องการพูดถึงบางสิ่งที่แปลกประหลาดของการค้นหาเช่นfind -- "$dir" ไม่แข็งแกร่ง ( $dirอาจใช้สำหรับภาคแสดง) ไม่มีทางที่จะทดสอบคุณลักษณะของ symlink ปัญหาการแข่งขัน ... สำหรับฉันfindและlocateแก้ไขปัญหาที่แตกต่างกันสองรายการ มีหลายสถานที่ที่ใช้การค้นหาไม่เหมือนจริง (เช่นไดเรกทอรีที่มีไฟล์นับล้าน) locator เป็นระบบการจัดทำดัชนีที่ จำกัด เฉพาะชื่อไฟล์
Stéphane Chazelas

2
การใช้งานครั้งแรกของlocateเป็นสิ่งที่ชอบประมาณคร่าว ๆfind / -type f | gzip > locate.gzและzgrep "$1" <locate.gz
F. Hauri

@ F.Hauri: เรื่องไม่สำคัญที่น่าสนใจ นี่คือเพิ่มเติม: GNU locateอยู่ในfindutilsแพคเกจและโปรแกรมจะดำเนินการในแง่ของupdatedb find(1)ดังนั้นในแง่ที่ว่าlocate(1)จริงต้อง find(1):)
Warren Young

1
@WarrenYoung ทำไมถึงมีการอ้างอิงถึง foo (1) อย่างต่อเนื่องแทนที่จะเป็นแค่ foo มี foo รุ่นอื่น ๆ บ้างไหม?
บ๊องเกี่ยวกับ natty

4
@nuttyaboutnatty: มันเป็นการประชุมโบราณในคู่มือ Unix หมายถึงส่วนคู่มือ 1. ในขณะที่มันเป็นความจริงว่าไม่มีfind, locateฯลฯ ในส่วนอื่น ๆ ดังนั้นจึงไม่จำเป็นต้องมีการกระจ่างชื่อเดียวกันที่ใช้ในส่วนต่างๆของ คู่มือ (เช่นunlink(1)vs unlink(2)) พวกเราคุ้นเคยกับการประชุมเห็นว่าเป็นการอ้างอิงหน้าคน
Warren Young

35

locateใช้ฐานข้อมูลที่สร้างไว้ล่วงหน้าซึ่งควรได้รับการอัปเดตเป็นประจำในขณะที่findวนซ้ำระบบไฟล์เพื่อค้นหาไฟล์

ดังนั้นlocateจะเร็วกว่าfindมาก แต่อาจไม่ถูกต้องหากฐานข้อมูล - สามารถมองว่าเป็นแคช - ไม่ได้รับการปรับปรุง (ดูupdatedbคำสั่ง)

นอกจากนี้ยังfindสามารถให้ความละเอียดมากขึ้นในขณะที่คุณสามารถกรองไฟล์ได้ทุกคุณสมบัติในขณะที่locateใช้รูปแบบที่ตรงกับชื่อไฟล์


7

findเป็นไปไม่ได้ที่ผู้ใช้มือใหม่หรือผู้ใช้ระบบปฏิบัติการ Unix จะสามารถใช้งานได้สำเร็จ ในอดีตบางรุ่นfindไม่ได้ตั้งค่า-printตัวเลือกเพิ่มให้กับผู้ใช้ที่เป็นมิตร

locate มีความยืดหยุ่นน้อยลง แต่ใช้งานง่ายกว่าในกรณีทั่วไป


1
ในทางกลับกันค้นหาจะต้องรักษาฐานข้อมูลและเรียกใช้เป็นระยะดังนั้นฉันได้ปิดการใช้งานบนเซิร์ฟเวอร์ Linux ทั้งหมดที่อยู่ในเครือข่ายส่วนตัวของเรา
Rui F Ribeiro

2
มันยากอะไร find . -name 'nametosearch'หรือ-inameสำหรับตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ แทนที่.ด้วยเส้นทางไดเรกทอรีเพื่อค้นหาอื่นที่ไม่ใช่ไดเรกทอรีปัจจุบัน นั่นคือ 90% ของความต้องการของผู้ใช้มือใหม่ที่ครอบคลุมโดยไม่ต้องไปแม้แต่การจัดเก็บไฟล์ (ฉันมักจะใช้find . -iname '*partialfilename*'และถ้าฉันค้นหาจาก/ผมใช้find / -maxdepth 5 -iname '*partialname*'ที่ลดลงเวลาการค้นหาขณะที่การหาทุกอย่างที่ฉันสนใจ 90% ของเวลาที่มี 75% ของความต้องการของผู้ใช้ระดับกลาง..) :)
Wildcard

2

ข้อเสียเปรียบเล็กน้อยในการค้นหาคืออาจไม่สามารถสร้างดัชนีพื้นที่ของระบบไฟล์ที่คุณสนใจบนระบบเดสก์ท็อปเดเบียนเช่น Linux Mint 17.2, ไฟล์ /etc/updatedb.conf ถูกกำหนดค่าเพื่อแยกพื้นที่บางส่วนออกจากการพิจารณา รวมถึง / tmp, / var / spool และ /home/.ecryptfs

การเพิกเฉย /home/.ecryptfs ป้องกันชื่อไฟล์ในไดเรกทอรีที่เข้ารหัสไม่ให้เปิดเผยกับผู้ใช้ที่ไม่ได้รับอนุญาต อย่างไรก็ตามหากไดเรกทอรีบ้านของคุณถูกเข้ารหัสด้วย ecryptfs ก็หมายความว่าไดเรกทอรีบ้านของคุณไม่ได้รับการจัดทำดัชนีและค้นหาจึงจะไม่พบสิ่งใดในไดเรกทอรีบ้านของคุณ สิ่งนี้อาจทำให้ไร้ประโยชน์มากสำหรับคุณ (ทำเพื่อฉัน) นอกเหนือจากการไม่ค้นหาผลลัพธ์กระบวนการที่ได้รับการอัพเดทจะโหลดดิสก์ของคุณเป็นระยะเพื่อไม่ได้รับประโยชน์และอาจถูกปิดใช้งานหากคุณเป็นผู้ใช้หลักหรือผู้ใช้รายเดียวของระบบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.