ฉันจะ grep ซ้ำได้อย่างไร


1682

ฉันจะเรียกคืนgrepไดเรกทอรีและไดเรกทอรีย่อยทั้งหมดซ้ำได้อย่างไร

find . | xargs grep "texthere" *

110
@ TC1 สิ่งที่น่าเศร้าก็คือ grep ตัวเองสามารถตอบคำถาม (อย่างน้อย GNU grep): grep --help | grep recursive
Frank Schmitt

7
หากคุณพบว่าตัวเองใช้ grep บ่อยครั้งในการทำการค้นหาแบบเรียกซ้ำ (โดยเฉพาะอย่างยิ่งถ้าคุณทำการยกเว้นไฟล์ / ไดเรกทอรีจำนวนมากด้วยตนเอง) คุณอาจพบว่าack (ทางเลือก grep ที่เป็นมิตรกับโปรแกรมเมอร์) มีประโยชน์
Nick McCurdy

19
ที่จริงแล้วทั้ง -r หรือ - ใช้งานไม่ได้ในกล่อง Solaris ที่ฉันใช้ในที่ทำงาน และหน้า man สำหรับ grep ไม่ได้พูดถึงสิ่งที่เกิดซ้ำ ฉันต้องรีสอร์ตเพื่อค้นหาและ xargs ตัวเอง
Ben

8
ag เป็นวิธีที่ฉันชอบทำตอนนี้github.com/ggreer/the_silver_searcher
dranxo

1
grep -rin xlsx *.plใช้ไม่ได้กับ Redhat Linux ฉันได้รับข้อผิดพลาด "ไม่ตรงกัน"
Bulrush

คำตอบ:


2507
grep -r "texthere" .

พารามิเตอร์แรกแสดงถึงนิพจน์ทั่วไปที่ต้องการค้นหาในขณะที่พารามิเตอร์ที่สองแสดงถึงไดเรกทอรีที่ควรค้นหา ในกรณีนี้.หมายถึงไดเรกทอรีปัจจุบัน

หมายเหตุ: สิ่งนี้ใช้ได้กับ GNU grep และในบางแพลตฟอร์มเช่น Solaris คุณต้องใช้ grep GNU โดยเฉพาะเมื่อเทียบกับการใช้งานแบบดั้งเดิม สำหรับ Solaris นี่คือggrepคำสั่ง


39
หมายเหตุ: "grep -r" ใช้ได้กับ greps ที่ใหม่กว่าเท่านั้น มันไม่ทำงานบน grep ที่มาพร้อมกับAIX 5.3ตัวอย่าง
ระงับ

110
ใช้ grep -R เพื่อติดตาม symlinks
Eloff

53
เป็นการดีที่จะรู้ว่า "-i" จะทำให้ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ "-n" รวมหมายเลขบรรทัดสำหรับผลลัพธ์ที่ตรงกันแต่ละรายการ
Sadegh

24
นอกจากนี้ยังเป็นการดีหากคุณกำลังมองหาสตริงคงที่และไม่ใช่ regex ให้ใช้ตัวเลือก -F มันจะช่วยให้คุณประหยัดเวลาได้โดยไม่ต้องเรียกใช้ตัวแยกวิเคราะห์ regex มีประโยชน์มากถ้าคุณกำลังค้นหาไฟล์จำนวนมาก
เจฟฟ์

6
alias rgrep = 'grep -r'
รับ

679

หากคุณรู้นามสกุลหรือรูปแบบของไฟล์ที่คุณต้องการวิธีอื่นคือการใช้--includeตัวเลือก:

grep -r --include "*.txt" texthere .

--excludeนอกจากนี้คุณยังสามารถพูดถึงไฟล์ที่จะไม่รวมกับ

Ag

หากคุณค้นหารหัสบ่อยๆAg (The Silver Searcher)เป็นทางเลือกที่รวดเร็วกว่า grep มากซึ่งเป็นรหัสที่กำหนดเองสำหรับการค้นหา ตัวอย่างเช่นมันเรียกซ้ำโดยค่าเริ่มต้นและจะไม่สนใจไฟล์และไดเรกทอรีที่อยู่ในรายการโดยอัตโนมัติ.gitignoreดังนั้นคุณไม่จำเป็นต้องผ่านตัวเลือกที่ไม่ยุ่งยากเช่นเดียวกับ grep หรือค้นหา


3
ใช้งานได้ดีกับ grep ที่มาพร้อมกับ Linux & Cygwin แต่ไม่เหมาะกับ grep ที่มาพร้อมกับ AIX
ระงับ

1
@KrzysztofWolny: `` แทนที่จะ=ทำงานได้ดีบน Ubuntu PS: ที่ควรจะเป็นพื้นที่ backticked แต่ตัวแยกวิเคราะห์ SO markdown ล้มเหลว
Dan Dascalescu

4
@DanDascalescu ฉัน upvoted สำหรับgrep, ไม่ได้สำหรับ Ag เพียงเพื่อให้คุณรู้ :)
เบอร์นาร์ด

1
เรามีตัวเลือกในการแยกไดเรกทอรีในขณะค้นหาซ้ำหรือไม่?
Tom Taylor

Windows cygwinชอบการเสนอราคาสองครั้ง--include "*.txt" --include "*.TXT"
Bob Stein

127

นอกจากนี้:

find ./ -type f -print0 | xargs -0 grep "foo"

แต่grep -rเป็นคำตอบที่ดีกว่า


14
หรือถ้าคุณไม่ต้องการที่จะกังวลเกี่ยวกับช่องว่างในชื่อไฟล์find . -type f -exec grep "foo" '{}' \;ทำงานได้ดีที่สนับสนุน
Edd Steel

4
หากคุณกำลังจะไปป์ค้นหาผ่าน xargs ถึง grep และหากคุณกำลังค้นหาสตริงคงที่เท่านั้น (เช่นไม่ใช่ regex) คุณอาจได้รับประโยชน์จากการเรียกใช้ตัวเลือก grep -F ดังนั้น grep จะไม่โหลดโปรแกรม regex สำหรับการร้องขอแต่ละครั้ง หากมีไฟล์จำนวนมากมันจะเร็วขึ้นมาก
Jeff

2
หา -type f -exec grep -Hu "foo" {} \; คือสิ่งที่ฉันใช้เพราะมันให้ชื่อไฟล์
Wes

สิ่งนี้ใช้ได้กับทุก * ระวังเพราะเป็นPOSIX 7
Ciro Santilli 法轮功病毒审查六四事件法轮功

1
find ./ -type f -print0 | xargs -0 grep "foo"
aehlke

118

ตอนนี้ฉันมักจะใช้ (แม้ใน Windows ด้วยGoW - Gnu บน Windows ):

grep --include="*.xxx" -nRHI "my Text to grep" *

ซึ่งรวมถึงตัวเลือกต่อไปนี้:

--include=PATTERN

recurse PATTERNในไดเรกทอรีเท่านั้นค้นหาไฟล์ที่ตรงกัน

-n, --line-number

นำหน้าแต่ละบรรทัดของเอาต์พุตด้วยหมายเลขบรรทัดภายในไฟล์อินพุต

(หมายเหตุ: phuclvเพิ่มในความคิดเห็นที่ -nลดประสิทธิภาพมากดังนั้นคุณอาจต้องการข้ามตัวเลือกนั้น)

-R, -r, --recursive

อ่านไฟล์ทั้งหมดภายใต้แต่ละไดเรกทอรีซ้ำ; นี่เท่ากับ-d recurseตัวเลือก

-H, --with-filename

พิมพ์ชื่อไฟล์สำหรับการแข่งขันแต่ละครั้ง

-I     

ประมวลผลไฟล์ไบนารีราวกับว่ามันไม่มีข้อมูลที่ตรงกัน
นี่เท่ากับ--binary-files=without-matchตัวเลือก

และฉันสามารถเพิ่ม ' i' ( -nRHIi) ถ้าฉันต้องการผลลัพธ์ที่ไม่ตรงตามตัวพิมพ์ใหญ่ - เล็ก

ฉันจะได้รับ:

/home/vonc/gitpoc/passenger/gitlist/github #grep --include="*.php" -nRHI "hidden" *
src/GitList/Application.php:43:            'git.hidden'      => $config->get('git', 'hidden') ? $config->get('git', 'hidden') : array(),
src/GitList/Provider/GitServiceProvider.php:21:            $options['hidden'] = $app['git.hidden'];
tests/InterfaceTest.php:32:        $options['hidden'] = array(self::$tmpdir . '/hiddenrepo');
vendor/klaussilveira/gitter/lib/Gitter/Client.php:20:    protected $hidden;
vendor/klaussilveira/gitter/lib/Gitter/Client.php:170:     * Get hidden repository list
vendor/klaussilveira/gitter/lib/Gitter/Client.php:176:        return $this->hidden;
...

Gow ดูมีแนวโน้ม - ใหม่กว่ายูทิลิตี้ GNU Windows ที่ฉันใช้อยู่ ลองเลยตอนนี้ ...
Radim Cernej

ความหมายของตัวละครสุดท้าย * ที่นี่คืออะไร?
lorniper

2
@ lorniper ทำให้เชลล์เลือกไฟล์และโฟลเดอร์ทั้งหมดในไดเรกทอรีปัจจุบันของคุณทำให้ grep ใช้กับไฟล์เหล่านั้นและ (เรียกซ้ำเนื่องจาก-Rตัวเลือก) กับโฟลเดอร์
VonC

2
@lorniper Noy ว่า: *หรือ.เป็นรูปแบบ glob (ตีความโดยเปลือก): unix.stackexchange.com/a/64695/7490 ' .' จะเลือก dotfiles หรือจุดโฟลเดอร์เช่นกัน (เหมือน.git/)
VonC

ก่อนหน้านี้ฉันเคยใช้เสมอgrep -rnIแต่จากนั้นฉันได้เรียนรู้ว่า-nประสิทธิภาพลดลงมากดังนั้นฉันจึงใช้เมื่อต้องการจริงๆและโดยปกติฉันจะใช้-rI
5153

25

ในระบบ POSIX คุณจะไม่พบ-rพารามิเตอร์สำหรับgrepและgrep -rn "stuff" .จะไม่ทำงาน แต่ถ้าคุณใช้findคำสั่งมันจะ:

find . -type f -exec grep -n "stuff" {} \; -print

เห็นด้วยและSolarisHP-UX


ความหมายของ {} \ คืออะไร พิมพ์ตามลำดับหรือไม่
user1169587

3
ใน-execตัวเลือก - สัญลักษณ์{}คือการอ้างอิงไปยังชื่อไฟล์ซึ่งปัจจุบันพบโดยfindเครื่องมือ (นั่นคือการทำอะไรกับชื่อไฟล์ที่เราพบ) -execตัวเลือกควรจะสิ้นสุดด้วย;สัญลักษณ์ (เพื่อทำเครื่องหมายจุดสิ้นสุดของคำสั่ง exec) แต่เพราะนี่คือทั้งหมด ทำงานในเปลือกที่สัญลักษณ์ควรจะหนี .. และสุดท้าย-printตัวเลือกช่วยให้findเครื่องมือในการพิมพ์ชื่อไฟล์ที่พบบนหน้าจอ
rook

19

globbing **

การใช้grep -rงาน แต่อาจมากเกินไปโดยเฉพาะในโฟลเดอร์ขนาดใหญ่

สำหรับการใช้งานจริงยิ่งขึ้นนี่คือไวยากรณ์ที่ใช้globbing syntax ( **):

grep "texthere" **/*.txt

ซึ่ง greps เฉพาะไฟล์ที่มีรูปแบบที่เลือกรูปแบบ การทำงานสำหรับเปลือกหอยที่สนับสนุนเช่นทุบตีที่ 4หรือzsh

shopt -s globstarเพื่อเปิดใช้งานคุณลักษณะนี้ทำงาน:

ดูเพิ่มเติม: ฉันจะค้นหาไฟล์ทั้งหมดที่มีข้อความเฉพาะบน Linux ได้อย่างไร

git grep

สำหรับโครงการภายใต้การควบคุมเวอร์ชัน Git ให้ใช้:

git grep "pattern"

ซึ่งเร็วกว่ามาก

ripgrep

สำหรับโครงการขนาดใหญ่เครื่องมือ grepping ที่เร็วที่สุดคือripgrepไฟล์ greps ที่เรียกซ้ำโดยค่าเริ่มต้น:

rg "pattern" .

มันถูกสร้างขึ้นจากเครื่องมือ regex ของ Rustซึ่งใช้ออโต้ไฟน์ จำกัด , SIMD และการเพิ่มประสิทธิภาพตัวอักษรที่ก้าวร้าวเพื่อให้การค้นหารวดเร็วมาก ตรวจสอบการวิเคราะห์รายละเอียดที่นี่


3
ขอบคุณสำหรับข้อเสนอแนะ grep greit - มันมีประโยชน์มากและฉันไม่รู้เกี่ยวกับมัน!
Basya

2
ขอบคุณสำหรับคำแนะนำ ripgrep มันเร็วกว่า
อะไรจะเจ๋ง

11

เพื่อหาชื่อของfilesด้วยpathซ้ำที่มีโดยเฉพาะอย่างยิ่งstringการใช้งานดังต่อไปนี้คำสั่งสำหรับUNIX:

find . | xargs grep "searched-string"

สำหรับLinux:

grep -r "searched-string" .

ค้นหาไฟล์บนUNIXเซิร์ฟเวอร์

find . -type f -name file_name

ค้นหาไฟล์บนเซิร์ฟเวอร์ LINUX

find . -name file_name


10

หากคุณต้องการติดตามเฉพาะไดเรกทอรีจริงไม่ใช่ลิงก์สัญลักษณ์

grep -r "thingToBeFound" directory

หากคุณต้องการติดตามลิงก์สัญลักษณ์รวมถึงไดเรกทอรีจริง (โปรดระวังการเรียกซ้ำแบบไม่สิ้นสุด)

grep -R "thing to be found" directory

เนื่องจากคุณพยายาม grep ซ้ำตัวเลือกต่อไปนี้อาจเป็นประโยชน์กับคุณ:

-H: outputs the filename with the line

-n: outputs the line number in the file

ดังนั้นหากคุณต้องการค้นหาไฟล์ทั้งหมดที่มี Darth Vader ในไดเรกทอรีปัจจุบันหรือไดเรกทอรีย่อยใด ๆ และจับชื่อไฟล์และหมายเลขบรรทัด แต่ไม่ต้องการให้ recursion ติดตามลิงก์สัญลักษณ์คำสั่งจะเป็น

grep -rnH "Darth Vader" .

หากคุณต้องการค้นหาคำทั้งหมดที่กล่าวถึง cat ในไดเรคทอรี

/home/adam/Desktop/TomAndJerry 

และขณะนี้คุณอยู่ในไดเรกทอรี

/home/adam/Desktop/WorldDominationPlot

และคุณต้องการจับชื่อไฟล์ แต่ไม่ใช่หมายเลขบรรทัดของอินสแตนซ์ใด ๆ ของสตริง "cats" และคุณต้องการให้ recursion ติดตามลิงก์สัญลักษณ์หากพบพวกเขาคุณสามารถเรียกใช้อย่างใดอย่างหนึ่งต่อไปนี้

grep -RH "cats" ../TomAndJerry                   #relative directory

grep -RH "cats" /home/adam/Desktop/TomAndJerry   #absolute directory

ที่มา:

ใช้งาน "grep --help"

คำแนะนำสั้น ๆ เกี่ยวกับลิงก์สัญลักษณ์สำหรับทุกคนที่อ่านคำตอบนี้และสับสนโดยการอ้างอิงของฉันถึงพวกเขา: https://www.nixtutor.com/freebsd/understanding-symbolic-links/


คำตอบที่ดี สวิตช์พิเศษ (-rnh) มีประโยชน์มากดังนั้นขอบคุณที่แนะนำพวกเขา
semtex41

8

ag เป็นวิธีที่ชื่นชอบการทำเช่นนี้ในขณะนี้github.com/ggreer/the_silver_searcher มันเป็นพื้นเดียวกันกับแอ๊ แต่มีการเพิ่มประสิทธิภาพอีกสองสาม

นี่คือมาตรฐานสั้น ๆ ฉันล้างแคชก่อนการทดสอบแต่ละครั้ง (cf /ubuntu/155768/how-do-i-clean-or-disable-the-memory-cache ) cf

ryan@3G08$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time grep -r "hey ya" .

real    0m9.458s
user    0m0.368s
sys 0m3.788s
ryan@3G08:$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time ack-grep "hey ya" .

real    0m6.296s
user    0m0.716s
sys 0m1.056s
ryan@3G08$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time ag "hey ya" .

real    0m5.641s
user    0m0.356s
sys 0m3.444s
ryan@3G08$ time ag "hey ya" . #test without first clearing cache

real    0m0.154s
user    0m0.224s
sys 0m0.172s


6

หากคุณกำลังมองหาเนื้อหาเฉพาะในไฟล์ทั้งหมดจากโครงสร้างไดเรกทอรีคุณอาจใช้findเนื่องจากมีความชัดเจนมากขึ้นว่าคุณกำลังทำอะไรอยู่:

find -type f -exec grep -l "texthere" {} +

โปรดทราบว่า-l(ตัวพิมพ์เล็กของ L) แสดงชื่อของไฟล์ที่มีข้อความ ลบออกหากคุณต้องการพิมพ์การแข่งขันแทน หรือใช้-Hเพื่อรับไฟล์พร้อมกับการแข่งขัน ทั้งหมดเข้าด้วยกันทางเลือกอื่น ๆ :

find -type f -exec grep -Hn "texthere" {} +

ที่ไหน-nพิมพ์หมายเลขบรรทัด


2
ได้รับการโหวตให้เป็นfindทางออกเดียวที่หลีกเลี่ยงการใช้งานโดยไม่จำเป็นxargsและ+แทนที่จะใช้\;ด้วย-execดังนั้นจึงหลีกเลี่ยงการเปิดตัวกระบวนการที่ไม่จำเป็นจำนวนมาก :-)
ShadowRanger

6

นี่คือสิ่งที่ทำงานกับเคสของฉันบนเครื่องปัจจุบันของฉัน (git bash บน windows 7)

find ./ -type f -iname "*.cs" -print0 | xargs -0 grep "content pattern"

ฉันมักจะลืม -print0 และ -0 สำหรับเส้นทางที่มีช่องว่าง

แก้ไข: เครื่องมือที่ต้องการของฉันตอนนี้แทน ripgrep: https://github.com/BurntSushi/ripgrep/releases มันเร็วมากและมีค่าเริ่มต้นที่ดีกว่า (เช่นเรียกซ้ำโดยปริยาย) ตัวอย่างเช่นเดียวกับคำตอบดั้งเดิมของฉัน แต่ใช้ ripgrep:rg -g "*.cs" "content pattern"


4

grep -r "texthere" . (ระยะเวลาแจ้งให้ทราบในตอนท้าย)

(เครดิต ^: https://stackoverflow.com/a/1987928/1438029 )


ชี้แจง:

grep -r "texthere" /(grep ไดเรกทอรีซ้ำทั้งหมดและไดเรกทอรีย่อย)

grep -r "texthere" .(grep ไดเรกทอรีและไดเรกทอรีย่อยเหล่านี้ซ้ำ ๆ ซ้ำ ๆ)

grep recursive

grep [options] PATTERN [FILE...]

[ตัวเลือก]

-R, -r, --recursive

อ่านไฟล์ทั้งหมดภายใต้แต่ละไดเรกทอรีซ้ำ

สิ่งนี้เทียบเท่ากับ-d recurseหรือ--directories=recurseตัวเลือก

http://linuxcommand.org/man_pages/grep1.html

grep ช่วย

$ grep --help

$ grep --help |grep recursive
  -r, --recursive           like --directories=recurse
  -R, --dereference-recursive

ทางเลือก

ack( http://beyondgrep.com/ )

ag( http://github.com/ggreer/the_silver_searcher )


4

ในปีพ. ศ. 2561 คุณต้องการใช้งานripgrepหรือthe-silver-searcherเพราะเร็วกว่าทางเลือกอื่น

นี่คือไดเรกทอรีที่มีไดเรกทอรีย่อยระดับ 336:

% find . -maxdepth 1 -type d | wc -l
     336

% time rg -w aggs -g '*.py'
...
rg -w aggs -g '*.py'  1.24s user 2.23s system 283% cpu 1.222 total

% time ag -w aggs -G '.*py$'
...
ag -w aggs -G '.*py$'  2.71s user 1.55s system 116% cpu 3.651 total

% time find ./ -type f -name '*.py' | xargs grep -w aggs
...
find ./ -type f -name '*.py'  1.34s user 5.68s system 32% cpu 21.329 total
xargs grep -w aggs  6.65s user 0.49s system 32% cpu 22.164 total

ใน OSX นี้ติดตั้ง:ripgrep brew install ripgrepการติดตั้งนี้silver-searcher: brew install the_silver_searcher.


ความเร็วเป็นสิ่งสำคัญหากคุณจำเป็นต้องทำสิ่งนี้บ่อยครั้ง แต่ส่วนมากของเราพบว่าตัวเองทำเช่นนี้เพียงไม่กี่ครั้งต่อปี การติดตั้ง juju tool du jour บุคคลที่สามที่ทันสมัยล่าสุดนั้นเกินความจริงและวิธีแก้ปัญหาที่ไม่ได้เปลี่ยนแปลงมากนักตั้งแต่ปี 1978 นั้นเป็นเรื่องดีที่จะรู้
tripleee

ฉันคิดว่ามันเป็นไปไม่ได้อย่างมากที่โปรแกรมเมอร์จะค้นหาข้อความในแผนผังต้นไม้เพียงปีละหลายครั้ง แต่ถึงแม้จะอยู่ในมุมมองของการใช้งาน แต่rgก็มีข้อได้เปรียบเหนือกว่าการปูด้วยก้อนกรวดรวมกันเป็นคำสั่ง grep แบบเรียกซ้ำตั้งแต่เริ่มต้น ใช้rg: rg foo. find . | xargs grep fooการใช้เครื่องมือยูนิกซ์: และถ้าใด ๆ find . -print0 | xargs -0 grep fooของไฟล์ของคุณมีคำพูดในนั้นคุณจำเป็นต้องใช้ คุณจะจำได้หรือไม่ว่าถ้าคุณใช้สิ่งนี้ปีละสองสามครั้ง?
hughdbrown

1
คุณกำลังลืมfind . -type f -exec grep 'regex' {} +ซึ่งแน่นอนจำง่ายถ้าคุณใช้เครื่องมือเหล่านี้ด้วยความสม่ำเสมอ แต่อาจเป็นไปได้ว่าคุณควรรันctagsหรือetagsบนทรีซอร์สของคุณหากคุณต้องการค้นหาสิ่งต่างๆบ่อยครั้ง
tripleee

ฉันใช้ ripgrep และเยี่ยมมาก แต่ผู้ค้นหาเงินนั้นยอดเยี่ยมสำหรับโปรแกรมเมอร์ +1
Matt

3

ในเซิร์ฟเวอร์ IBM AIX ของฉัน (เวอร์ชัน OS: AIX 5.2) ให้ใช้:

find ./ -type f -print -exec grep -n -i "stringYouWannaFind" {} \; 

สิ่งนี้จะพิมพ์พา ธ / ชื่อไฟล์และหมายเลขบรรทัดสัมพัทธ์ในไฟล์เช่น:

./inc/xxxx_x.h

2865: / ** คำอธิบาย: stringYouWannaFind * /

อย่างไรก็ตามมันใช้งานได้สำหรับฉัน:)


3

ด้านล่างนี้เป็นคำสั่งสำหรับการค้นหาStringซ้ำUnixและLinuxสภาพแวดล้อม

สำหรับUNIXคำสั่งคือ:

find . -name "string to be searched" -exec grep "text" "{}" \;

สำหรับLinuxคำสั่งคือ:

grep -r "string to be searched" .

2

สำหรับรายการของธงที่มีอยู่:

grep --help 

ส่งคืนการจับคู่ทั้งหมดสำหรับtext regexp ในไดเรกทอรีปัจจุบันด้วยหมายเลขบรรทัดที่สอดคล้องกัน:

grep -rn "texthere" .

ส่งคืนการจับคู่ทั้งหมดสำหรับtexthereเริ่มต้นที่ไดเร็กทอรี root ด้วยหมายเลขบรรทัดที่สอดคล้องกันและไม่สนใจขนาดตัวพิมพ์:

grep -rni "texthere" /

ธงที่ใช้ที่นี่:

  • -r recursive
  • -n พิมพ์หมายเลขบรรทัดพร้อมเอาต์พุต
  • -i ไม่สนใจกรณี

1

ฉันเดาว่านี่คือสิ่งที่คุณพยายามจะเขียน

grep myText $(find .)

และนี่อาจเป็นประโยชน์อย่างอื่นถ้าคุณต้องการค้นหาไฟล์ grep hit

grep myText $(find .) | cut -d : -f 1 | sort | uniq

มันใช้งานง่ายมาก: ตัวอย่างเช่น: grep -i acc $ (ค้นหา. -name "execution *. *")
Yu Shen

1

ขว้างสองเซ็นต์ของฉันที่นี่ อย่างที่คนอื่นพูดถึงแล้วgrep -r ใช้ไม่ได้กับทุกแพลตฟอร์ม นี่อาจฟังดูไร้สาระ แต่ฉันมักจะใช้คอมไพล์

git grep "texthere"

แม้ว่าไดเรกทอรีจะไม่ถูกจัดฉากฉันแค่ทำมันและใช้ greit grep


0

โปรดทราบว่าfind . -type f | xargs grep whateverการแก้ปัญหาประเภทต่างๆจะพบข้อผิดพลาด "รายการอาร์กิวเมนต์เป็นยาว" เมื่อมีไฟล์ที่ตรงกับการค้นหามากเกินไป

ทางออกที่ดีที่สุดคือgrep -rแต่ถ้ายังไม่มีให้ใช้find . -type f -exec grep -H whatever {} \;แทน


ฮะ? xargsเป็นการแก้ปัญหาเฉพาะสำหรับปัญหา "รายการอาร์กิวเมนต์ยาวเกินไป"
tripleee

2
เอ่อ no - xargs นั้นใช้สำหรับการแปลงไพพ์ของอากิวเมนต์เป็น arglist แต่ใช่มันเป็นความจริงที่ว่า xargs ที่ทันสมัยเมื่อใช้กับ -s และ / หรือ -Lสามารถจัดการกับ arglists ที่ยาวมากโดยแบ่งการเรียกใช้คำสั่งหลายตัว แต่ ไม่ได้กำหนดค่าไว้ตามค่าเริ่มต้น (และไม่ได้อยู่ในการตอบกลับด้านบน) เป็นตัวอย่าง:find . -type f | xargs -L 100 grep whatever
m.thome

แพลตฟอร์มใดที่จะเปิด POSIXxargsได้มาตรฐานเพื่อให้พฤติกรรมนี้ออกจากกล่อง " xargsยูทิลิตี้จะจำกัดความยาวบรรทัดคำสั่งเช่นนั้นเมื่อมีการเรียกใช้บรรทัดคำสั่งอาร์กิวเมนต์ที่รวมกันและรายการสภาพแวดล้อม ... จะต้องไม่เกิน {ARG_MAX} -2048 ไบต์"
tripleee

ฮึ่ม ในขณะที่เอกสาร gnu นั้นมีความชัดเจนน้อยกว่า posix บนพื้นฐานนี้และฉันไม่สามารถเข้าถึงเครื่องที่ทำให้ฉันใช้คำสั่งนี้ได้อีกต่อไปฉันไม่สามารถยืนยันการตีความดั้งเดิมของฉันเกี่ยวกับการใช้งานในปัจจุบัน แน่นอนว่า grep แบบเรียกซ้ำยังคงดีกว่าถ้ามี แต่ก็มีเหตุผลเล็กน้อยที่จะหลีกเลี่ยงสูตร xargs (ใช้ -H สำหรับ grep เพื่อหลีกเลี่ยงการเรียกใช้ครั้งสุดท้ายของ grep ที่จะส่งผ่านเพียงชื่อไฟล์เดียว)
m.thome

0

เพียงเพื่อความสนุกการค้นหาไฟล์ * .txt ที่รวดเร็วและสกปรกหากคำตอบ @christangrant พิมพ์มากเกินไป :-)

grep -r texthere .|grep .txt


0

นี่คือฟังก์ชั่นแบบเรียกซ้ำ (ทดสอบเบา ๆ ด้วย bash และ sh) ที่สำรวจโฟลเดอร์ย่อยทั้งหมดของโฟลเดอร์ที่กำหนด ($ 1) และใช้grepการค้นหาสตริงที่กำหนด ($ 3) ในไฟล์ที่กำหนด ($ 2):

$ cat script.sh
#!/bin/sh

cd "$1"

loop () {
    for i in *
    do
        if [ -d "$i" ]
        then
            # echo entering "$i"
            cd "$i"
            loop "$1" "$2"
        fi
    done

    if [ -f "$1" ]
    then
        grep -l "$2" "$PWD/$1"
    fi

    cd ..
}

loop "$2" "$3"

ใช้มันและตัวอย่างผลลัพธ์:

$ sh script start_folder filename search_string
/home/james/start_folder/dir2/filename

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