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


10

พบไฟล์จำนวนมากที่อยู่ภายใต้ไดเรกทอรีย่อยต่างๆของ "Dropnot"

$ locate Dropnot

ฉันสามารถค้นหาเฉพาะตำแหน่งไดเรกทอรีด้วยได้locateหรือไม่ (ซึ่งไดเรกทอรี "Dropnot" อยู่ใน)

ดังนั้นหากDropnotอยู่ใน/home/me/นั่นเป็นรายการเดียวที่ได้รับคืน

ถ้าเป็นอย่างนั้นวิธีที่ง่ายที่สุด / สั้นที่สุดคืออะไร?

โดยเฉพาะอย่างยิ่งผ่านการตั้งค่าสถานะหรือสัญลักษณ์แทนการ piping และ greping สำหรับมัน ฯลฯ แต่ฉันจะใช้ทุกอย่างเป็นตัวเลือก

บางที Dropnot $ สำหรับการวางสายบางอย่าง? (แต่ไม่ได้ผล)

คำตอบ:


5

มีตัวเลือกที่จะใช้ไม่เป็นlocateจะหาประเภทที่เลือกของไฟล์ (เช่นไดเรกทอรี) แต่คุณสามารถใช้ไวยากรณ์จากคำถามของคุณ - ที่จะหาสายที่ลงท้ายด้วยDropnot$ Dropnotเพื่อที่คุณจะต้องใช้-eตัวเลือกในการค้นหาเพื่อเปิดการแสดงออกปกติ POSIX

ในกรณีนี้คุณควรใช้:

locate -e Dropnot$

เป็นสิ่งสำคัญที่รุ่นของการค้นหาคุณมี ในระบบของฉัน (Gentoo Linux) ฉันมี Secure Locate:

$ locate --version
Secure Locate 3.1 - Released March 7, 2006

ที่ไม่มี--basenameตัวเลือกจากutherคำตอบของ ตัวเลือกนี้จัดทำโดย GNU ค้นหาจากแพ็คเกจ findutils:

$ ./locate --version
locate (GNU findutils) 4.4.2

หากคุณต้องการที่จะใช้ regexp กับ GNU ค้นหาที่คุณควรใช้สวิทช์แทน-r-e


1
ไม่ใช่-eตัวเลือกonly print entries for currently existing filesเหรอ?
phuclv

10

ฉันmlocateติดตั้งแล้ว มันเป็นค่าเริ่มต้นกระจายโดย RedHat ดังนั้นมันจะอยู่ใน Fedora, RHEL, CentOS จากman 1 locate

-b, --basename
       Match  only  the  base  name  against the specified patterns. This 
       is the opposite of --wholename.

ดังนั้นหากคุณเรียกใช้locate -b '\Dropknot'มันจะรายงานเฉพาะไฟล์หรือไดเรกทอรีที่มีสตริงนั้นเท่านั้น

Because \ is a globbing character, this disables the implicit replacement 
of NAME by *NAME*.

locate -b /Dropnotทำงานแล้ว
Michael Durrant

4

ด้วยการค้นหาของ GNU (การใช้งานการค้นหาอื่น ๆ อาจแตกต่างกัน):

locate '*/Dropnot'
locate Dropnot | grep '/Dropnot$'

เมื่อไม่มี wildcard ในอาร์กิวเมนต์ให้locateค้นหาพา ธ ที่มีคำค้นหาที่ระบุเป็นสตริงย่อย เมื่ออาร์กิวเมนต์เป็นรูปแบบของเชลล์ที่มีอักขระตัวแทนอย่างน้อยหนึ่งตัวlocateค้นหาการจับคู่ที่สมบูรณ์ หากคุณไม่ต้องการที่จะส่งออก/Dropnotในตอนท้าย:

locate -0 '*/Dropnot' | xargs -0 -n1 dirname
locate Dropnot | sed -n 's:/Dropnot$::p'

0

หากคุณใช้ RedHat อยู่คุณอาจติดตั้ง mlocate แล้วไม่พบ Secure Locate ในกรณีนั้นไม่มีตัวเลือก -e และคุณต้องใช้ -r หรือ --regexp เพื่อค้นหาโดยใช้นิพจน์ปกติพื้นฐาน


0

Slackware ใช้slocateตามค่าเริ่มต้นซึ่งมีตัวเลือกการค้นหา regex r :

locate -r '/Dropnot$'

Dropnotจะค้นหาไดเรกทอรีที่มีชื่อ

นี้จะค้นหาเช่นไดเรกทอรีที่มีหมายเลขเท่านั้นDropnot(Dropnot1, Dropnot2, ฯลฯ ):

locate -r '/Dropnot[[:digit:]]\+$'

0

ไม่ทราบว่าทำไมไม่มีใครเสนออะไรแบบนั้น:

for i in $(locate MYDIR); do [ -d "$i" ] && echo $i; done

นี่แค่ตรวจสอบว่าสตริงการค้นหาใด ๆ เป็นไดเรกทอรีและพิมพ์หรือไม่

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