ฉันกำลังค้นหาผ่านที่เก็บ Git และต้องการรวม.git
โฟลเดอร์
grep
ไม่รวมโฟลเดอร์นี้ถ้าฉันเรียกใช้
grep -r search *
คำสั่ง grep เพื่อรวมโฟลเดอร์นี้คืออะไร?
ฉันกำลังค้นหาผ่านที่เก็บ Git และต้องการรวม.git
โฟลเดอร์
grep
ไม่รวมโฟลเดอร์นี้ถ้าฉันเรียกใช้
grep -r search *
คำสั่ง grep เพื่อรวมโฟลเดอร์นี้คืออะไร?
คำตอบ:
โปรดดูวิธีแก้ไขในตอนท้ายของโพสต์นี้เพื่อเป็นทางเลือกที่ดีกว่าสำหรับสิ่งที่คุณกำลังทำอยู่
คุณสามารถรวมไฟล์ที่ซ่อนไว้อย่างชัดเจน (ไดเร็กทอรีก็คือไฟล์เช่นกัน)
grep -r search * .*
*
จะตรงกับไฟล์ทั้งหมดยกเว้นคนที่ซ่อนอยู่และ.*
จะตรงกับไฟล์ที่ซ่อนอยู่เท่านั้น อย่างไรก็ตามสิ่งนี้จะล้มเหลวหากไม่มีไฟล์ที่ไม่ถูกซ่อนหรือไม่มีไฟล์ที่ซ่อนอยู่ในไดเร็กทอรีที่กำหนด แน่นอนคุณสามารถอย่างชัดเจนเพิ่มแทน.git
.*
อย่างไรก็ตามหากคุณต้องการค้นหาในไดเรกทอรีที่กำหนดให้ทำดังนี้:
grep -r search .
.
จะตรงกับเส้นทางปัจจุบันซึ่งจะรวมถึงทั้งสองไฟล์ที่ไม่ใช่ที่ซ่อนอยู่และซ่อน
.*
จะรวมไดเร็กทอรีหลัก (เนื่องจาก..
ตรงกัน)
ฉันเพิ่งพบปัญหานี้และจากคำตอบของ @ bitmask นี่คือการปรับเปลี่ยนง่ายๆของฉันเพื่อหลีกเลี่ยงปัญหาที่ @sehe:
grep -r search_string * .[^.]*
sudo grep -r ANDROID_HOME * .[^.]*
ฉันทำอะไรผิดที่นี่?
บางทีคุณอาจต้องการรวม "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
คุณอาจต้องการใช้วิธีนี้โดยสมมติว่าคุณกำลังค้นหาไดเร็กทอรีปัจจุบัน (มิฉะนั้นแทนที่ด้วยไดเร็กทอรีที่ต้องการ):
find . -type f | xargs grep search
หรือหากคุณต้องการค้นหาที่ระดับบนสุด (ซึ่งทดสอบได้เร็วกว่าว่าคุณกำลังลองใช้สิ่งเหล่านี้อยู่หรือไม่):
find . -type f -maxdepth 1 | xargs grep search
UPDATE: ฉันแก้ไขตัวอย่างตามความคิดเห็นของ Scott ฉันยังเพิ่ม "-type f"
~
คือโฮมไดเร็กทอรีของผู้ใช้ ~
คำถามที่ไม่ได้เกี่ยวกับไดเรกทอรีบ้านของผู้ใช้เพื่อให้คำตอบที่ไม่ควรพูดถึง (2) ใน find
คำสั่ง-name '*'
คือ no-op (กล่าวคือไม่มีจุดประสงค์ใด ๆ )
หากต้องการค้นหาเฉพาะไฟล์และไดเรกทอรีที่ซ่อนอยู่ทั้งหมดจากตำแหน่งปัจจุบันของคุณ:
find . -name ".*" -exec grep -rs search {} \;
เฉพาะไฟล์ที่ซ่อนอยู่ทั้งหมด:
find . -name ".*" -type f -exec grep -s search {} \;
เฉพาะไดเรกทอรีที่ซ่อนอยู่ทั้งหมด:
find . -name ".*" -type d -exec grep -rs search {} \;
คำตอบอื่น ๆ ทั้งหมดดีกว่า อันนี้อาจจำง่าย:
find . -type f | xargs grep search
พบเฉพาะไฟล์ (รวมถึงซ่อน) และ greps แต่ละไฟล์
หากต้องการค้นหาภายในโฟลเดอร์บางโฟลเดอร์คุณสามารถใช้ได้:
ls -al | grep " \."
มันเป็นคำสั่งที่ง่ายมากในการแสดงรายการและไปที่ grep
นอกเหนือจากคำแนะนำของ Tyler แล้วนี่คือคำสั่งเพื่อ grep ไฟล์และโฟลเดอร์ทั้งหมดซ้ำ ๆ รวมถึงไฟล์ที่ซ่อนอยู่
find . -name "*.*" -exec grep -li 'search' {} \;
เพื่อป้องกันไม่ให้การจับคู่.
และ..
ที่ไม่ได้ซ่อนไฟล์คุณสามารถใช้grep
ด้วยls -A
เช่นในตัวอย่างนี้:
ls -A | grep "^\."
^\.
ระบุว่าอักขระตัวแรกต้องเป็น .
-A
หรือ--almost-all
ไม่รวมตัวเลือกผล.
และ..
เพื่อให้ไฟล์ที่ซ่อนอยู่เท่านั้นและไดเรกทอรีจะถูกจับคู่
คุณยังสามารถค้นหาไฟล์ที่ซ่อนบางประเภทได้เช่นนี้สำหรับไฟล์ไดเรกทอรีที่ซ่อนอยู่:
grep -r --include=*.directory "search-string"
วิธีนี้อาจทำงานได้ดีกว่าตัวเลือกอื่น ๆ ตัวเลือกอื่น ๆ ที่ใช้งานได้อาจช้าเกินไป