ฉันสงสัยว่าจะ จำกัด ช่วงการค้นหาของ "ค้นหา" ในบางไดเรกทอรีได้อย่างไร
ตัวอย่างเช่นวิธีค้นหาไฟล์ / ไดเรกทอรีด้วยสตริง "math" ในชื่อภายใต้บางไดเรกทอรี "/ home / tim / science /"
ขอบคุณและขอแสดงความนับถือ!
ฉันสงสัยว่าจะ จำกัด ช่วงการค้นหาของ "ค้นหา" ในบางไดเรกทอรีได้อย่างไร
ตัวอย่างเช่นวิธีค้นหาไฟล์ / ไดเรกทอรีด้วยสตริง "math" ในชื่อภายใต้บางไดเรกทอรี "/ home / tim / science /"
ขอบคุณและขอแสดงความนับถือ!
คำตอบ:
UPDATE : หมายเหตุเกี่ยวกับการใช้ตัวเลือก regของlocatorเทียบกับการขยายชื่อไฟล์ของเชลล์ที่สัมพันธ์กับการค้นหา args ของ ...
การขยายชื่อไฟล์ของเชลล์
เมื่อคุณพิมพ์locate /bin/b*(หมายเหตุไม่มีคำพูด) สิ่งต่าง ๆ เกิดขึ้น
locateบรรทัดคำสั่งแต่ละรายการเป็นจำนวนมาก locate จากนั้นทดสอบแต่ละ args เหล่านี้กับแต่ละไฟล์ในฐานข้อมูลและผลลัพธ์ที่ตรงกัน อย่างไรก็ตามโปรดทราบว่า 'ค้นหา' ไม่มีแนวคิดของไดเรกทอรีการทำงานปัจจุบัน มันตรงกับ args ของคุณกับที่มีคุณสมบัติครบถ้วนไฟล์ชื่อในฐานข้อมูลของ
ซึ่งหมายความว่ามันจะจับคู่ทั้งคู่/bin/bash และ /home/user/bin/brackets
คุณมีการควบคุมในระดับนี้ แต่การค้นหาregexของข้อเสนอเพิ่มเติม เช่นเดียวกับตัวเลือกการค้นหาอื่น ๆ
LOCATE'S REGEX OPTION
เมื่อคุณพิมพ์locate -r "/bin/b.*"สิ่งต่าง ๆ เกิดขึ้นมากกว่าการใช้ args แบบง่าย ๆ .. ( shell-extended-args เป็นเพียงรายการของ args แบบง่าย ๆ )
-rตัวเลือกที่บอกหาการรักษาหาเรื่องของคุณเป็นรูปแบบ regex 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
ทราบ: -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เพื่อรีเฟรชฐานข้อมูลของตำแหน่ง ... (แต่ถ้าคุณเพิ่งเพิ่มเข้าไปคุณอาจรู้ว่ามันอยู่ที่ไหน:) ....
สอดท่อผ่าน grep เช่นนี้
$ locate less | grep ^/bin
/bin/bzless
/bin/less
/bin/lessecho
/bin/lessfile
/bin/lesskey
/bin/lesspipe
/bin/zless
แก้ไข: คำตอบอื่น ๆ ดีกว่าฉันไม่ทราบว่าคุณสามารถผ่านรูปแบบการค้นหา
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กว่ารายการทั้งหมดใน
O(log(n))ขณะที่การค้นหา regex คือO(n)อะไร จำนวนรายการใน db เหมือนกันในแต่ละกรณี ฉันเดาว่าเป็นอัลกอริทึมการค้นหาหรือไม่
คุณสามารถใช้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 (ซึ่งดี แต่ไม่จำเป็นในกรณีนี้)
สำหรับฉันสะดวกที่สุดคือ
cd /home/tim/science
locate math | grep `pwd`