ฉันจะค้นหาไฟล์ด้วยชื่อและพา ธ บางส่วนได้อย่างไร


64

บ่อยครั้งที่ฉันมีชื่อไฟล์และมันเป็นเส้นทางบางส่วนเช่น "content / docs / file.xml"

มีวิธีง่าย ๆ ในการค้นหาไฟล์นั้นโดยไม่ต้องตัดชื่อส่วนด้วยตนเองเพื่อระบุชื่อไดเรกทอรีและชื่อไฟล์แยกกันหรือไม่?

มันจะดีถ้าfindทำงานด้วยวิธีนี้ดังนั้นฉันจึงวิ่งfind content/docs/file.xmlได้ แต่น่าเสียดายที่มันไม่


1
คุณสามารถลองเพิ่ม * wildcard ที่จุดเริ่มต้น find -path *content/docs/file.xmlทำงานให้ฉัน
Bob

ขอบคุณ @Bob มันใช้งานได้จริงสำหรับฉัน Btw น่าสนใจว่าถ้าฉันเพิ่มเครื่องหมายสแลชหลังเครื่องหมายดอกจัน: "find -path * / content / docs / file.xml" มันไม่ทำงาน ขอบคุณมากอยู่ดี

@Bob ด้วยโปรดทำมันเป็นคำตอบและฉันจะทำเครื่องหมายว่าถูกต้อง

สาเหตุที่เครื่องหมายสแลชหลังจากเครื่องหมายดอกจันไม่ทำงานอาจเป็นเพราะเครื่องหมายดอกจันควรถูกหลบหนีดูการแก้ไขคำตอบของฉัน
Bob

คำตอบ:


72

ผ่านใน*สัญลักษณ์แทนเพื่อบ่งชี้ถึงการแข่งขันอะไร คุณจำเป็นต้องหลบหนี*s เช่น:

find . -path \*content/docs/file.xml

หรือใส่รูปแบบในเครื่องหมายคำพูดเช่น:

find . -path "*content/docs/file.xml"

ดังที่หน้า man อธิบาย:

$ ค้นหา -name * .c -print

find: พา ธ ต้องนำหน้านิพจน์

สิ่งนี้เกิดขึ้นเพราะ * .c ถูกขยายโดยเชลล์ทำให้พบการรับบรรทัดคำสั่งเช่นนี้:

หา -name bigram.c code.c frcode.c locate.c -print

แน่นอนว่าคำสั่งนั้นจะไม่ทำงาน แทนที่จะทำอย่างนี้คุณควรใส่รูปแบบในเครื่องหมายคำพูดหรือหลีกเลี่ยงไพ่เสริม:

$ ค้นหา -name \ *. c -print


10

find มีตัวเลือก -wholename ด้วย find $top_dir -wholename *string*

find /usr -wholename *in/abiw*

>/usr/bin/abiword

ฉันไม่ทราบเส้นทางแบบเต็มเพียงบางส่วนเท่านั้นดังนั้น "-wholename" จะไม่ทำงาน

ธงเข้าใจผิดดูตัวอย่างของฉัน ... มันช่วยให้คุณสามารถขยายสตริงลงในไดเรกทอรีถ้าคุณรู้
technosaurus

3
find . -type f | grep "content/docs/file.xml"

หรือเพียงแค่

locate content/docs/file.xml

ค้นหาเป็นตัวเลือกที่น่าสนใจ แต่ค้นหาทั้งดิสก์ฉันต้องการมีความสามารถในการระบุไดเรกทอรีการค้นหาฐานหรืออย่างน้อยเพื่อระบุการใช้พารามิเตอร์การค้นหาที่ควรทำจากไดเรกทอรีนี้ (เช่นตัวเลือกแรกของคุณ) ไม่ใช่จากรูท

1
@ user69817 - ตรงกันข้ามค้นหาไม่ค้นหาดิสก์มันซักถามฐานข้อมูลค้นหาซึ่งโดยทั่วไปจะได้รับการเติมผ่าน cron วันละครั้ง
ทิงค์

1

ยกตัวอย่างเช่นการค้นหาไฟล์ในสถานที่โดยใช้เครื่องหมายดอกจัน / ตัวแทน ( *) เช่น คุณสามารถใช้ค้นหาdir=“/apps/*/instance01/" ${dir} -name “*.jks”วางไฟล์ทั้งหมดในอาร์เรย์เช่นนี้

arr=(`find ${dir} -name “*.jks"`)

หากคุณต้องการใช้ไฟล์ที่มีนามสกุลอื่น ๆ ให้ใช้ 'หรือ' เช่นนี้:

-name "*.keystore" -o -name "*.jks" -o -name “*.p12" เพราะ-nameยอมรับเฉพาะสตริงเดี่ยวดังนั้นให้ใช้ 'หรือ'

ในที่สุดก็ใส่ทุกอย่างลงในอาร์เรย์ดังนี้:

arr=(`find ${dir} -name "*.keystore" -o -name "*.jks" -o -name "*.p12"`)

หากคุณมีเส้นทางแบบเต็มไม่ใช่เส้นทางบางส่วนมันง่ายกว่ามากที่จะใส่ไว้ในอาร์เรย์ดังนี้:

arr=(“/Users/ajay/Documents/keystore_and_p12files/"*.{keystore,p12,jks})
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.