ฉันจะใช้ grep เพื่อค้นหาคำภายในโฟลเดอร์ได้อย่างไร


542

ใน Windows ฉันจะทำการค้นหาคำภายในโฟลเดอร์ ในทำนองเดียวกันฉันต้องการทราบว่ามีคำที่เฉพาะเจาะจงเกิดขึ้นภายในไดเรกทอรีที่มีไดเรกทอรีย่อยและไฟล์จำนวนมากหรือไม่ การค้นหาของฉันสำหรับการแสดงไวยากรณ์ grep grep string filenameฉันต้องระบุชื่อไฟล์คือ

ตอนนี้ฉันไม่รู้จักชื่อไฟล์ฉันจะทำยังไงดี? เพื่อนแนะนำให้ทำgrep -nr stringแต่ฉันไม่รู้ว่าสิ่งนี้หมายความว่าอย่างไรและฉันไม่ได้ผลลัพธ์ด้วย (ไม่มีการตอบกลับจนกว่าฉันจะออกctrl + c)

คำตอบ:


848
grep -nr 'yourString*' .

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

-n            Show relative line number in the file
'yourString*' String for search, followed by a wildcard character
-r            Recursively search subdirectories listed
.             Directory for search (current directory)

grep -nr 'MobileAppSer*' . (จะค้นหาMobileAppServlet.javaหรือMobileAppServlet.classหรือMobileAppServlet.txt; 'MobileAppASer*.*'เป็นอีกวิธีหนึ่งในการทำสิ่งเดียวกัน)

หากต้องการตรวจสอบพารามิเตอร์เพิ่มเติมให้ใช้คำสั่งman grep


14
ธุรกิจกับ*อะไร มันอาจจะส่งผลในการขยายตัวสัญลักษณ์แทนเปลือก (ถ้ามีชื่อไฟล์ที่ตรงกับรูปแบบสัญลักษณ์แทน) หรือ grep จะใช้มันเป็น 0 หรืออื่น ๆ *ผู้ประกอบการทำซ้ำสำหรับตัวก่อนหน้านี้
usta

7
ตอนนี้ขอพิจารณาความเป็นไปได้ทั้งสำหรับgrep -nr MobileAppSer* .1. สมมติเรามี 3 ไฟล์ในการจับคู่ไดเรกทอรีปัจจุบันMobileAppSer*รูปแบบสัญลักษณ์แทน: ชื่อMobileAppServlet.java, ,MobileAppServlet.class MobileAppServlet.txtจากนั้นจะถูกเรียกเช่นนี้grep grep -nr MobileAppServlet.class MobileAppServlet.java MobileAppServlet.txt .หมายถึงค้นหาข้อความ "MobileAppServlet.class" ในไฟล์ MobileAppServlet.java, MobileAppServlet.txt และที่อื่น ๆ ในไดเรกทอรีปัจจุบัน - ซึ่งแน่นอนว่าไม่ใช่สิ่งที่ผู้ใช้ต้องการที่นี่
usta

7
2. ในกรณีที่ไม่มีไฟล์ในไดเรกทอรีปัจจุบันที่ตรงกับMobileAppSer*รูปแบบไวด์การ์ดgrepจะได้รับอาร์กิวเมนต์MobileAppSer*ตามที่เป็นและจะใช้เป็นข้อความค้นหา "MobileAppSe" ตามด้วย 0 หรือมากกว่านั้นเกิดขึ้นของ "r" ดังนั้นมันจะ พยายามค้นหาข้อความ "MobileAppSe", "MobileAppSer", "MobileAppSerr", "MobileAppSerrr" ฯลฯ ในเนื้อหาไฟล์ของไดเรกทอรีปัจจุบัน - ไม่ใช่สิ่งที่ผู้ใช้ต้องการ
usta

5
นี่เป็นตัวเลือกที่น่าสงสัยของ regex Usta ได้ชี้ให้เห็นสิ่งนี้
kindasimple

117
grep -nr string my_directory

หมายเหตุเพิ่มเติม: สิ่งนี้สอดคล้องกับไวยากรณ์grep [options] string filenameเนื่องจากในระบบที่คล้าย Unix ไดเรกทอรีเป็นไฟล์ชนิดหนึ่ง (มีคำว่า "ไฟล์ปกติ" เพื่ออ้างถึงเอนทิตีที่เรียกว่า "ไฟล์" ใน Windows) โดยเฉพาะ

grep -nr string อ่านเนื้อหาเพื่อค้นหาจากอินพุตมาตรฐานนั่นคือสาเหตุที่มันรอที่นั่นเพื่อป้อนข้อมูลจากคุณและหยุดทำเมื่อคุณกด ^ C (มันจะหยุดใน ^ D เช่นกันซึ่งเป็นชุดคีย์สำหรับการสิ้นสุด -ไฟล์).


1
เฮ้ดังนั้นถ้าฉันต้องการค้นหาสตริงโดยไม่คำนึงถึงกรณีฉันต้องทำเช่นนี้: grep -i -nr "my word"
kiki

2
@kiki: ใช่ซึ่งเทียบเท่ากับgrep -inr "my word" .
usta

16
@kiki: -rสำหรับ grep หมายถึงการค้นหาในไดเรกทอรีย่อยซ้ำและ-nหมายถึงคำนำหน้าแต่ละบรรทัดของเอาต์พุตด้วยหมายเลขบรรทัดที่สอดคล้องกันของไฟล์ซึ่งมีบรรทัดนั้น man grepอธิบายทั้งหมดนี้และอีกมากมาย
usta

62

GREP : การพิมพ์ / Parser / ตัวประมวลผล / โปรแกรมการแสดงออกปกติทั่วโลก
คุณสามารถใช้สิ่งนี้เพื่อค้นหาไดเรกทอรีปัจจุบัน
คุณสามารถระบุ -R สำหรับ "recursive" ซึ่งหมายถึงโปรแกรมค้นหาในโฟลเดอร์ย่อยทั้งหมดและโฟลเดอร์ย่อยและโฟลเดอร์ย่อยของโฟลเดอร์ย่อยเป็นต้น

grep -R "your word" .

-nจะพิมพ์หมายเลขบรรทัดที่ตรงกับไฟล์
-iจะค้นหาตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ (ตัวพิมพ์ใหญ่ / ไม่ใช่ตัวพิมพ์ใหญ่)

grep -inR "your regex pattern" .

3
./* หมายถึงไฟล์ทั้งหมดในไดเรกทอรีปัจจุบัน -R วิธี recursive (ค้นหาไดเรกทอรีย่อย ฯลฯ )
สเตฟานสไตเกอร์

25
grep -nr search_string search_dir

จะทำการค้นหาแบบซ้ำ (หมายถึงไดเรกทอรีและค้นหาไดเรกทอรีย่อยทั้งหมด) สำหรับ search_string (ตอบโดยถูกต้องโดย usta)

เหตุผลที่คุณไม่ได้รับคำแนะนำจากเพื่อน:

grep -nr string

เป็นเพราะไม่มีการระบุไดเรกทอรี หากคุณอยู่ในไดเรกทอรีที่คุณต้องการทำการค้นหาคุณต้องทำสิ่งต่อไปนี้:

grep -nr string .

มันเป็นสิ่งสำคัญที่จะรวมถึง '.' ตัวอักษรเช่นนี้บอก grep เพื่อค้นหาไดเรกทอรีนี้


สวัสดีฉันควรทำอย่างไรถ้าฉันต้องค้นหา 2 คำโดยเว้นวรรคระหว่างกัน ควรระบุคำต่าง ๆ ไว้ในเครื่องหมายคำพูด? เช่น grep -nr "คำพูดของฉัน"
kiki

24

นอกจากนี้ยังมี:

find directory_name -type f -print0 | xargs -0 grep -li word

แต่นั่นอาจเป็นเรื่องเล็กน้อยสำหรับผู้เริ่มต้น

findเป็นไดเร็กตอรี่-type fสำหรับจุดประสงค์ทั่วไปของวอล์คเกอร์ / ลิสเตอร์, หมายถึง "มองหาไฟล์ธรรมดามากกว่าไดเรกทอรีและไพพ์ที่มีชื่อและสิ่งที่คุณมี", -print0หมายถึง "พิมพ์ลงบนเอาต์พุตมาตรฐานโดยใช้อักขระ null เป็นตัวคั่น" เอาต์พุตจากfindถูกส่งไปที่xargs -0และคว้าอินพุตมาตรฐานเป็นชิ้น (เพื่อหลีกเลี่ยงข้อจำกัดความยาวบรรทัดคำสั่ง) โดยใช้อักขระ null เป็นตัวแยกเรคคอร์ด (แทนที่จะขึ้นบรรทัดใหม่มาตรฐาน) และใช้grep -li wordกับไฟล์แต่ละชุด ในgrep, -lหมายถึง "รายการไฟล์ที่การแข่งขัน" และ-iหมายถึง "กรณีตาย"; คุณมักจะสามารถรวมตัวเลือกตัวเดียวดังนั้นคุณจะเห็นบ่อยกว่า-li-l -i

หากคุณไม่ได้ใช้-print0และ-0จากนั้นคุณจะใช้เป็นปัญหากับชื่อไฟล์ที่มีช่องว่างเพื่อใช้พวกเขาเป็นนิสัยที่ดี


1
@mmmshuddup: ขอบคุณ ฉันรู้สึกไม่ดีถ้าฉันไม่ได้ให้คำอธิบายเป็นส่วนหนึ่งของคำตอบโดยเฉพาะเมื่อทำงานกับผู้เริ่มต้น
mu สั้นเกินไป

1
นั่นคือสิ่งที่ฉันขอขอบคุณมากที่สุดในเว็บไซต์นี้ เป็นสิ่งสำคัญที่ต้องจำไว้ว่าเราทุกคนเป็นผู้เริ่มต้นครั้งเดียวและไม่ใช่เรื่องง่ายที่จะเกิดขึ้นในโลกแห่งเทคโนโลยี!
ใช่ Barry

ฉันจะยกเว้นบางไดเรกทอรีได้อย่างไร @muistooshort
Ferologics

@Ferologics ควรมีให้ตรวจสอบman findจากบรรทัดคำสั่งเพื่อดูตัวเลือกที่คุณfindสนับสนุน
mu สั้นเกินไป

8

ทำไมไม่ทำการค้นหาแบบเรียกซ้ำเพื่อค้นหาอินสแตนซ์ทั้งหมดในไดเรกทอรีย่อย:

grep -r 'text' *

งานนี้มีเสน่ห์เหมือนกัน


1
ไม่จำเป็นต้องพูดสตริงการค้นหาโดยไม่มีตัวอักษรพิเศษเช่นช่องว่าง
Scott Stensland

5
  1. grep -r "yourstring" * จะพบ "yourstring" ในไฟล์และโฟลเดอร์ใด ๆ

ตอนนี้ถ้าคุณต้องการค้นหาสองสายที่แตกต่างกันในเวลาเดียวกันคุณสามารถใช้ตัวเลือก E และเพิ่มคำสำหรับการค้นหา ตัวอย่างหลังจากหยุด

  1. grep -rE "yourstring|yourotherstring|$" *จะค้นหาตำแหน่งรายการที่yourstringหรือyourotherstringตรงกับ

4

ตัวเลือกอื่นที่ฉันชอบใช้:

find folder_name -type f -exec grep your_text  {} \;

-type f ส่งคืนเฉพาะไฟล์และไม่ใช่โฟลเดอร์

-exec และ {} รัน grep บนไฟล์ที่พบในการค้นหา (ไวยากรณ์ที่ถูกต้องคือ "-exec คำสั่ง {}")



2

คำตอบที่คุณเลือกนั้นใช้ได้และใช้งานได้ แต่ไม่ใช่วิธีที่ถูกต้องเพราะ:

grep -nr yourString* .

นี่เป็นการค้นหาสตริง"yourStrin"และ"g"0 หรือหลายครั้ง

ดังนั้นวิธีที่เหมาะสมในการทำคือ:

grep -nr \w*yourString\w* .

คำสั่งนี้ค้นหาสตริงด้วยอักขระใด ๆ ก่อนและหลังบนโฟลเดอร์ปัจจุบัน


2
แต่ก็ใช้grep -nr yourStringงานได้เช่นกันเพราะมันมองหาภาพเปลือยyourStringที่ใดก็ได้ในบรรทัด (หรืออย่างน้อยก็ในระบบของฉัน, OSX Lion)
theheadofabroom

1

คล้ายกับคำตอบที่โพสต์โดย @eLRuLL วิธีที่ง่ายกว่าในการระบุการค้นหาที่เคารพขอบเขตคำคือการใช้-wตัวเลือก:

grep -wnr "yourString" .

ใน cmd พรอมต์หรือหน้าต่างสถานี grep ระยะไม่เป็นที่รู้จัก
kouty

@kouty grep เป็นคำสั่ง Unix itechtics.com/using-findstr-windows
Hugo M. Zuleta

1

เรียกใช้ (เทอร์มินัล) คำสั่งต่อไปนี้ภายในไดเรกทอรี มันจะตรวจสอบภายในไดเรกทอรีย่อยซ้ำด้วย

grep -r 'your string goes here' * 

0

กลุ่มตัวอย่างที่มีลักษณะดังต่อไปนี้ซ้ำสำหรับyour search stringใน*.xmlและ*.jsไฟล์อยู่ที่ไหนสักแห่งภายในโฟลเดอร์path1, และpath2path3

grep -r --include=*.xml --include=*.js "your search string" path1 path2 path3

ดังนั้นคุณสามารถค้นหาในหลาย ๆ เซ็ตของไฟล์เพื่อหาไดเร็กตอรี่มากมาย, เพียงแค่ระบุพา ธ ที่ส่วนท้าย


-4

อย่าใช้ grep ดาวน์โหลดซิลเวอร์ค้นหาหรือripgrep มันมีทั้งดีเด่นและเร็วกว่า grep หรือ ack ด้วยตัวเลือกมากมาย


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