ฉันจะ grep ไฟล์ที่ซ่อนอยู่ได้อย่างไร


98

ฉันกำลังค้นหาผ่านที่เก็บ Git และต้องการรวม.gitโฟลเดอร์

grep ไม่รวมโฟลเดอร์นี้ถ้าฉันเรียกใช้

grep -r search *

คำสั่ง grep เพื่อรวมโฟลเดอร์นี้คืออะไร?

คำตอบ:


137

โปรดดูวิธีแก้ไขในตอนท้ายของโพสต์นี้เพื่อเป็นทางเลือกที่ดีกว่าสำหรับสิ่งที่คุณกำลังทำอยู่

คุณสามารถรวมไฟล์ที่ซ่อนไว้อย่างชัดเจน (ไดเร็กทอรีก็คือไฟล์เช่นกัน)

grep -r search * .*

*จะตรงกับไฟล์ทั้งหมดยกเว้นคนที่ซ่อนอยู่และ.*จะตรงกับไฟล์ที่ซ่อนอยู่เท่านั้น อย่างไรก็ตามสิ่งนี้จะล้มเหลวหากไม่มีไฟล์ที่ไม่ถูกซ่อนหรือไม่มีไฟล์ที่ซ่อนอยู่ในไดเร็กทอรีที่กำหนด แน่นอนคุณสามารถอย่างชัดเจนเพิ่มแทน.git.*

อย่างไรก็ตามหากคุณต้องการค้นหาในไดเรกทอรีที่กำหนดให้ทำดังนี้:

grep -r search .

.จะตรงกับเส้นทางปัจจุบันซึ่งจะรวมถึงทั้งสองไฟล์ที่ไม่ใช่ที่ซ่อนอยู่และซ่อน


1
แนวทางแรก (grep -r search *. *) ใช้ได้ผลสำหรับฉัน แนวทางที่สอง (grep -r search.) ไม่พบสตริง ฉันพบผลลัพธ์ที่คล้ายกันเมื่อละเว้น "-r" และค้นหาไดเรกทอรีระดับบนสุดเท่านั้น ฉันใช้ GNU grep 2.6.3
Alan

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

27
การใช้.*จะรวมไดเร็กทอรีหลัก (เนื่องจาก..ตรงกัน)
ดู

1
ปลอดภัยหรือไม่ที่จะสรุปเกี่ยวกับการแก้ปัญหานี้เนื่องจากพฤติกรรมอาจแตกต่างกันไประหว่างเปลือกหอย?
astletron

6
สำหรับเวอร์ชันแรกคุณควรเพิ่ม --exclude-dir = .. เพื่อหลีกเลี่ยงการค้นหาในโฟลเดอร์หลัก
user762353

12

ฉันเพิ่งพบปัญหานี้และจากคำตอบของ @ bitmask นี่คือการปรับเปลี่ยนง่ายๆของฉันเพื่อหลีกเลี่ยงปัญหาที่ @sehe:

grep -r search_string * .[^.]*

ฉันไม่ได้รับผลลัพธ์ใด ๆ จากการใช้สิ่งนี้: sudo grep -r ANDROID_HOME * .[^.]*ฉันทำอะไรผิดที่นี่?
messerbill

@messerbill คุณกำลังค้นหาอยู่ที่ไหน
insaner

3

บางทีคุณอาจต้องการรวม "grep" กับคำสั่ง "find" เพื่อให้ได้โซลูชันที่สมบูรณ์เช่น:

find . -exec grep -Hn search {} \;

คำสั่งนี้จะค้นหาไฟล์หรือไดเรกทอรีที่ซ่อนอยู่ภายในสำหรับสตริง "ค้นหา" และแสดงรายการไฟล์ใด ๆ โดยบังเอิญกับรูปแบบผลลัพธ์นี้:

เส้นทางไฟล์: หมายเลขบรรทัด: บรรทัดด้วยความบังเอิญ

./foo/bar:42:search line
./foo/.bar:42:search line
./.foo/bar:42:search line
./.foo/.bar:42:search line

2

คุณอาจต้องการใช้วิธีนี้โดยสมมติว่าคุณกำลังค้นหาไดเร็กทอรีปัจจุบัน (มิฉะนั้นแทนที่ด้วยไดเร็กทอรีที่ต้องการ):

find . -type f | xargs grep search

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

find . -type f -maxdepth 1 | xargs grep search

UPDATE: ฉันแก้ไขตัวอย่างตามความคิดเห็นของ Scott ฉันยังเพิ่ม "-type f"


1
(1)  ~คือโฮมไดเร็กทอรีของผู้ใช้ ~คำถามที่ไม่ได้เกี่ยวกับไดเรกทอรีบ้านของผู้ใช้เพื่อให้คำตอบที่ไม่ควรพูดถึง (2) ใน  findคำสั่ง-name '*'คือ no-op (กล่าวคือไม่มีจุดประสงค์ใด ๆ )
Scott

1

หากต้องการค้นหาเฉพาะไฟล์และไดเรกทอรีที่ซ่อนอยู่ทั้งหมดจากตำแหน่งปัจจุบันของคุณ:

find . -name ".*" -exec grep -rs search {} \;

เฉพาะไฟล์ที่ซ่อนอยู่ทั้งหมด:

find . -name ".*" -type f -exec grep -s search {} \;

เฉพาะไดเรกทอรีที่ซ่อนอยู่ทั้งหมด:

find . -name ".*" -type d -exec grep -rs search {} \;

1

คำตอบอื่น ๆ ทั้งหมดดีกว่า อันนี้อาจจำง่าย:

find . -type f | xargs grep search

พบเฉพาะไฟล์ (รวมถึงซ่อน) และ greps แต่ละไฟล์


0

หากต้องการค้นหาภายในโฟลเดอร์บางโฟลเดอร์คุณสามารถใช้ได้:

ls -al | grep " \."

มันเป็นคำสั่งที่ง่ายมากในการแสดงรายการและไปที่ grep


0

นอกเหนือจากคำแนะนำของ Tyler แล้วนี่คือคำสั่งเพื่อ grep ไฟล์และโฟลเดอร์ทั้งหมดซ้ำ ๆ รวมถึงไฟล์ที่ซ่อนอยู่

find . -name "*.*" -exec grep -li 'search' {} \;

0

เพื่อป้องกันไม่ให้การจับคู่.และ..ที่ไม่ได้ซ่อนไฟล์คุณสามารถใช้grepด้วยls -Aเช่นในตัวอย่างนี้:

ls -A | grep "^\."

^\. ระบุว่าอักขระตัวแรกต้องเป็น .

-Aหรือ--almost-allไม่รวมตัวเลือกผล.และ..เพื่อให้ไฟล์ที่ซ่อนอยู่เท่านั้นและไดเรกทอรีจะถูกจับคู่


0

คุณยังสามารถค้นหาไฟล์ที่ซ่อนบางประเภทได้เช่นนี้สำหรับไฟล์ไดเรกทอรีที่ซ่อนอยู่:

grep -r --include=*.directory "search-string"

วิธีนี้อาจทำงานได้ดีกว่าตัวเลือกอื่น ๆ ตัวเลือกอื่น ๆ ที่ใช้งานได้อาจช้าเกินไป

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