ฉันสงสัยว่าจะ จำกัด ช่วงการค้นหาของ "ค้นหา" ในบางไดเรกทอรีได้อย่างไร
ตัวอย่างเช่นวิธีค้นหาไฟล์ / ไดเรกทอรีด้วยสตริง "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`