ใช้ "ค้นหา" ภายใต้ไดเรกทอรีเฉพาะบางอย่างหรือไม่


46

ฉันสงสัยว่าจะ จำกัด ช่วงการค้นหาของ "ค้นหา" ในบางไดเรกทอรีได้อย่างไร

ตัวอย่างเช่นวิธีค้นหาไฟล์ / ไดเรกทอรีด้วยสตริง "math" ในชื่อภายใต้บางไดเรกทอรี "/ home / tim / science /"

ขอบคุณและขอแสดงความนับถือ!

คำตอบ:


30

UPDATE : หมายเหตุเกี่ยวกับการใช้ตัวเลือก regของlocatorเทียบกับการขยายชื่อไฟล์ของเชลล์ที่สัมพันธ์กับการค้นหา args ของ ...

การขยายชื่อไฟล์ของเชลล์
เมื่อคุณพิมพ์locate /bin/b*(หมายเหตุไม่มีคำพูด) สิ่งต่าง ๆ เกิดขึ้น

  1. ขั้นแรกการขยายชื่อไฟล์ของเชลล์จะขยายรูปแบบเชลล์พิเศษcharecter * (นี่เป็นเพราะ * ไม่มีการป้องกันคือไม่มี "double-quote")
  2. การขยายตัวส่งผลให้นี้เป็นรายชื่อของชื่อไฟล์ ซึ่งอาจยาวมาก ... รายการนี้ส่งผ่านไปยังlocateบรรทัดคำสั่งแต่ละรายการเป็นจำนวนมาก
  3. locate จากนั้นทดสอบแต่ละ args เหล่านี้กับแต่ละไฟล์ในฐานข้อมูลและผลลัพธ์ที่ตรงกัน

อย่างไรก็ตามโปรดทราบว่า 'ค้นหา' ไม่มีแนวคิดของไดเรกทอรีการทำงานปัจจุบัน มันตรงกับ args ของคุณกับที่มีคุณสมบัติครบถ้วนไฟล์ชื่อในฐานข้อมูลของ
ซึ่งหมายความว่ามันจะจับคู่ทั้งคู่/bin/bash และ /home/user/bin/brackets
คุณมีการควบคุมในระดับนี้ แต่การค้นหาregexของข้อเสนอเพิ่มเติม เช่นเดียวกับตัวเลือกการค้นหาอื่น ๆ

LOCATE'S REGEX OPTION
เมื่อคุณพิมพ์locate -r "/bin/b.*"สิ่งต่าง ๆ เกิดขึ้นมากกว่าการใช้ args แบบง่าย ๆ .. ( shell-extended-args เป็นเพียงรายการของ args แบบง่าย ๆ )

  1. -rตัวเลือกที่บอกหาการรักษาหาเรื่องของคุณเป็นรูปแบบ regex
  2. เครื่องหมายคำพูดป้องกัน * จากชื่อไฟล์เปลือกขยาย หมายความว่า * และจุด เป็นอักขระพิเศษของ regex
  3. ด้วยการเป็น regex คุณสามารถบอกได้อย่างง่ายดายว่า 'ค้นหา' เพื่อจับคู่รายการฐานข้อมูลในรูปแบบต่าง ๆ : eg1 locate -r "^/bin/b.*"สร้างชื่อไฟล์ที่ขึ้นต้นด้วย/ bin / b ... eg2 locate -r ~/"bin/b.*"สร้างชื่อไฟล์ที่เริ่มต้นด้วย/ home / user / bin / b .. โปรดทราบว่า ~ / ไม่ได้รับการคุ้มครองโดย "เครื่องหมายคำพูด" และดังนั้นจึงขึ้นอยู่กับเชลล์ tilde-expansionซึ่งแปลง ~ / เป็น / home / user /

สรุป: "การขยายชื่อไฟล์เชลล์" ค่อนข้างแตกต่างจาก 'regex'

กลับไปที่โพสต์ต้นฉบับ:


locate โดยทั่วไปจะแสดงรายการฐานข้อมูลทั้งหมดเป็น stdout ดังนั้นเพื่อ จำกัด ไปยังไดเรกทอรีเฉพาะที่คุณต้องการกรอง ... คุณสามารถทำได้ผ่านตัวเลือกของการค้นหา

คุณสามารถใช้ความสามารถในการค้นหาของตำแหน่งแทนที่จะเป็นเพียงเปลือก - กลม ... ( locate /dir/myfile* คือเปลือก - กลม) ...

จากข้อมูลการค้นหา : -r,--regex

  • "... (regex) การจับคู่จะดำเนินการกับชื่อพา ธ ทั้งหมดและตามค่าเริ่มต้นชื่อพา ธ จะถูกจับคู่หากส่วนใดส่วนหนึ่งของมันตรงกับนิพจน์ทั่วไปที่ระบุนิพจน์ทั่วไปอาจใช้^หรือ$เพื่อยึดการจับคู่ที่ จุดเริ่มต้นหรือจุดสิ้นสุดของชื่อพา ธ "

ทราบ: -i =
ไม่สนใจกรณี . . . . -r =
regex . . . . ~ / จะขยายได้โดยเปลือก / home / ผู้ใช้ (เมื่อ ~ /
ไม่ได้อยู่ในเครื่องหมายคำพูด) . . . . '\' (baskslash + space; ไม่มีเครื่องหมายอัญประกาศ) เป็นช่องว่างแท้จริง (เพื่อหลีกเลี่ยงการขยายตัวของเชลล์) คุณสามารถใส่สตริงในเครื่องหมายคำพูดได้ แต่อย่าลืมใส่เครื่องหมาย~ /ภายนอกเครื่องหมายคำพูด: ~/my\ regexหรือ-/"my regex"

เช่น. locate -ir ~/".*"la\ bella\ vitaเป็นเช่นเดียวกับlocate -ir ~/".*la bella vita"และจะค้นหาไดเรกทอรีบ้านทั้งหมดของคุณสำหรับ "La Bella Vita" ที่เกิดขึ้นทุกที่

นอกจากนี้คุณยังสามารถ จำกัด การค้นหาเฉพาะชื่อไฟล์แต่ใช้-bหรือ--basename.. ซึ่งในกรณีนี้การเริ่มต้นของบรรทัด regex ^จะใช้กับเฉพาะชื่อไฟล์ ...

ฉันมักพบว่าตัวเองใช้ locate -bir

PS .. Locateเร็วมากจนฉันไม่เคยใช้find... และไม่เคยใช้การค้นหาหอยโข่ง (ช้าเกินไป)

ด้วย 'ค้นหา' หากคุณกำลังมองหาบางอย่างที่เพิ่งถูกเพิ่มเข้ามาใหม่ให้เรียกใช้sudo updatedbเพื่อรีเฟรชฐานข้อมูลของตำแหน่ง ... (แต่ถ้าคุณเพิ่งเพิ่มเข้าไปคุณอาจรู้ว่ามันอยู่ที่ไหน:) ....


13

สอดท่อผ่าน grep เช่นนี้

$ locate less | grep ^/bin
/bin/bzless
/bin/less
/bin/lessecho
/bin/lessfile
/bin/lesskey
/bin/lesspipe
/bin/zless

แก้ไข: คำตอบอื่น ๆ ดีกว่าฉันไม่ทราบว่าคุณสามารถผ่านรูปแบบการค้นหา


@ อดัม .. อย่าประมาทวิธีการของคุณ มันค่อนข้างโอเค แต่คุณสามารถใช้ regex ของตัวเองแทนที่จะใช้ pip กับ grep .. วิธีการ "อื่น ๆ " ที่คุณอ้างถึงไม่ได้ใช้ regex และทำงานแตกต่างกันมาก .... ฉันได้เพิ่มรายละเอียดบางอย่างเกี่ยวกับความแตกต่างของฉัน คำตอบ ...
Peter.O

2
ค้นหาน้อย | grep ^ / bin เป็นวิธีที่เร็วกว่าหา -r ^ / bin /.* น้อยเพราะหาน้อยจะดำเนินการค้นหาที่มีประสิทธิภาพสำหรับคำน้อยและหา -r จะดำเนินการ regex ในรายการทั้งหมดใน locatedb
มาร์เซลเดซ Orozco

@MarcelValdezOrozco "การค้นหาคำที่มีประสิทธิภาพ" คืออะไรและทำไมมันเร็วกว่า regex
Flashrunner

@Flashrunner เพราะlocateไม่O(log(n))ค้นหามากกว่าlocatedbเมื่อคุณให้คำค้นหาที่ไม่ regex แล้วคุณสามารถใช้grep's regex ที่จะดำเนินการO(m)ค้นหาผ่านลดลงแล้วผลย่อย (n = จำนวนรายการทั้งหมดในlocatedb[เช่นไฟล์ไดรฟ์ทั้งหมดของคุณ], m = # รายการที่ตรงกับคุณน้อยกว่าlocatedb) ความซับซ้อนในการใช้งานทั้งหมด: O(log(n)) + O(m)โดยที่ m อยู่ในระดับเฉลี่ยlog(n)ดังนั้นคุณจะได้รับ2*O(log(n))เมื่อเทียบกับO(n)เมื่อคุณทำงาน แบบสอบถาม regex locatedbกว่ารายการทั้งหมดใน
Marcel Valdez Orozco

@MarcelValdezOrozco แต่ทำไมการค้นหาที่ไม่ใช่ regex ผ่าน db คือO(log(n))ขณะที่การค้นหา regex คือO(n)อะไร จำนวนรายการใน db เหมือนกันในแต่ละกรณี ฉันเดาว่าเป็นอัลกอริทึมการค้นหาหรือไม่
Flashrunner

8

คุณสามารถใช้locate /rootpath/*filenamespec. ฉันไม่เคยลองมาก่อน แต่ดูเหมือนจะใช้งานได้ เมื่อต้องการทำตัวอย่างของคุณมันจะเป็นlocate /home/tim/science/*math*

คุณอาจต้องการดูfindคำสั่งมากกว่าlocateสำหรับลักษณะการทำงานนั้น find rootforsearch -name filenamepattern -printไวยากรณ์จะเป็น ในกรณีนี้ตัวอย่างของคุณจะต้องfind /home/tim/science -name *math* -printไม่เร็วเท่าที่ค้นหาเนื่องจากไม่มีฐานข้อมูลที่จะค้นหา ... แต่จริงๆแล้วมันค้นหาระบบไฟล์ มีตัวเลือกมากมายที่คุณสามารถใช้นอกเหนือจากการพิมพ์ได้เช่นกันหากคุณตั้งใจจะทำบางสิ่งกับไฟล์


นี่เป็นคำตอบที่ดีที่สุดเนื่องจากใช้locateตัวเอง (ไม่ต้องการยูทิลิตี้อื่น ๆ เช่นgrep) และไม่มี regexps (ซึ่งดี แต่ไม่จำเป็นในกรณีนี้)
ทอม

อันนี้ใช้งานได้จริง ๆ เหมือนกับเครื่องรางที่คุณสามารถใช้ค้นหาเพื่อค้นหาไฟล์ในเส้นทางเฉพาะของไดเรกทอรีขอบคุณ @Nerdfest
amit_game

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