ฉันจะมี grep ไม่พิมพ์ข้อผิดพลาด 'ไม่มีไฟล์หรือไดเรกทอรีดังกล่าวได้อย่างไร?


215

ฉันกำลัง grepping ผ่านกองขนาดใหญ่ของรหัสที่จัดการโดย git และเมื่อใดก็ตามที่ฉันทำ grep ฉันเห็นกองและกองของข้อความของแบบฟอร์ม:

> grep pattern * -R -n
whatever/.git/svn: No such file or directory

มีวิธีใดที่ฉันจะทำให้เส้นเหล่านั้นหายไป?


1
วันนี้ผมขอแนะนำให้ใช้ag, ackหรือcgrepแทน - พวกเขากำลังได้เร็วขึ้นมาก / ดีกว่าgrepสำหรับการค้นหาที่เก็บรหัส
lunixbochs

หากคุณกำลังอ่านโค้ดและค้นหาเพื่อหลีกเลี่ยงไดเรกทอรีเฉพาะบางทีคุณควรดู ack มันเป็น grep ที่รับรู้ซอร์สโค้ดและดังนั้นจะเพิกเฉยต่อไดเรกทอรี VCS ดังกล่าว (รวมถึงการสำรองข้อมูล vi และ emacs, ไฟล์ที่ไม่ใช่ซอร์สเป็นต้น)
Brian Agnew

2
ผู้ใช้จะได้รับNo such file or directoryข้อความสำหรับไฟล์และ / หรือไดเรกทอรีที่มีอยู่ได้อย่างไร หรือในทางกลับกันจะสามารถgrep *รับชื่อไฟล์ที่ไม่มีอยู่ได้อย่างไร นี่เป็นสภาวะการแย่งชิงซึ่งกระบวนการอื่น ๆ ดำเนินการกับแผนผังไดเรกทอรี (การสร้างการเปลี่ยนชื่อและการลบไฟล์) ในขณะที่grepกำลังรันอยู่หรือไม่?
สกอตต์

คำตอบ:


299

คุณสามารถใช้-sหรือ--no-messagesตั้งค่าสถานะเพื่อระงับข้อผิดพลาด

-s, - ไม่มีข้อความระงับข้อความแสดงข้อผิดพลาด

grep pattern * -s -R -n

14
@Alex @Dogbert คำถามนี้ตอบคำถามได้ แต่ '-s' สามารถปกปิดปัญหาได้เช่นเมื่อคุณใช้ xargs ด้วย grep ลองสร้าง 2 ไฟล์ใน dir 'aaa.txt' และ 'a b.txt' ซึ่งทั้งคู่มีสตริง 'some text' คำสั่ง/bin/ls -1 | xargs grep 'some text'จะให้ "ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว" เพราะจะแบ่ง 'a b.txt' เป็น 2 args หากคุณระงับคุณจะไม่พบว่าคุณพลาดไฟล์
เคลวิน

@Kelvin ทำเช่นถ้าฉันใช้findและใช้งานprint0ด้วยxargs -0นั่นจะแก้ปัญหาได้หรือไม่? ขอบคุณ
Luka

1
@Luka ที่ควรแก้ปัญหา คุณจะไม่ประสบปัญหาหากคุณใช้ตัวเลือก NUL เหล่านั้นเสมอ แต่ถ้าคุณทำไม่ได้มันเกือบจะรับประกันได้ (IMHO) ว่าคุณจะลืมเวลาที่ไม่เหมาะสมที่สุด
เคลวิน

สิ่งนี้ใช้ได้กับ Mac OS X โดยที่ตัวเลือกอื่น (- เงียบ) ไม่ได้
philshem

59

หากคุณกำลัง grepping git grepผ่านเก็บคอมไพล์ผมอยากแนะนำให้คุณใช้ คุณไม่จำเป็นต้องผ่าน-Rหรือเส้นทาง

git grep pattern

ที่จะแสดงการแข่งขันทั้งหมดจากไดเรกทอรีปัจจุบันของคุณลง


5
+1 สำหรับคำสั่งเฉพาะ git ที่มีประโยชน์ จะไม่ทำงานสำหรับ SVN แม้ว่า :-)
cadrian

2
+1 นี่คือคำสั่ง git ที่ฉันหายไป - นี่ทำให้ฉัน grep สำหรับสตริงจากสถานะของต้นไม้ในการกระทำใด ๆ (โดยการเพิ่มการกระทำหลังจาก "รูปแบบ")
เคลวิน

1
ด้วยปลั๊กอินผู้ลี้ภัยGgrepค้นหาด้วยการเริ่มต้นจากด้านบนของไดเรกทอรี Git แทนที่จะเป็นไดเรกทอรีปัจจุบัน
Ciro Santilli 郝海东冠状病六四事件法轮功

สิ่งนี้ดูเหมือนจะเร็วกว่า grep มาตรฐานอย่างมาก (บางทีมันอาจจะไม่สนใจไฟล์ไบนารีและอื่น ๆ ไม่มีความคิด แต่มีประโยชน์)
Daniel

10

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

grep pattern * -R -n 2>/dev/null

ตอบคำถาม แต่สามารถปกปิดปัญหาได้ ดูความคิดเห็นของฉันภายใต้คำตอบของ Dogbert
เคลวิน

5

ฉันได้เห็นว่าเกิดขึ้นหลายครั้งด้วยลิงก์ที่ใช้งานไม่ได้ (symlink ชี้ไปที่ไฟล์ที่ไม่มีอยู่) grep พยายามค้นหาไฟล์เป้าหมายซึ่งไม่มีอยู่ (ดังนั้นจึงเป็นข้อความแสดงข้อผิดพลาดที่ถูกต้องและแม่นยำ)

ปกติฉันไม่ต้องกังวลในขณะที่ทำงานดูแลระบบเหนือคอนโซล แต่จากภายในสคริปต์ฉันจะมองหาไฟล์ข้อความด้วย "find" แล้วจึง grep แต่ละไฟล์:

find /etc -type f -exec grep -nHi -e "widehat" {} \;

แทน:

grep -nRHi -e "widehat" /etc

4

ฉันมักจะไม่ปล่อยให้ grep ทำการค้นหาซ้ำ โดยปกติจะมีไดเรกทอรีบางรายการที่คุณต้องการข้าม (.git, .svn ... )

คุณสามารถใช้นามแฝงที่ฉลาดได้โดยใช้สถานการณ์เช่นนี้:

find . \( -name .svn -o -name .git \) -prune -o -type f -exec grep -Hn pattern {} \;

มันอาจดูเหมือน overkill ในครั้งแรก แต่เมื่อคุณต้องการกรองรูปแบบบางอย่างมันค่อนข้างมีประโยชน์


1
+1 สิ่งนี้ดีกว่าการระงับข้อผิดพลาด อย่างไรก็ตามฉันคิดว่าคุณลืม-execก่อนหน้า grep ของคุณ
เคลวิน

1
สิ่งนี้หมายความว่า? \( -name .svn -o -name .git \)
sbhatla

ทำไมไม่ใช้ธง --exclude หรือ --exlcude-dir ของ grep
Choylton B. Higginbottom

1
@sbhatla วงเล็บสร้างลำดับของการดำเนินการสำหรับคำสั่ง find stackoverflow.com/questions/24338777/…
Choylton B. Higginbottom

4

คุณลอง-0ตัวเลือกเป็นxargs แล้วหรือยัง? บางสิ่งเช่นนี้

ls -r1 | xargs -0 grep 'some text'

2
สำหรับการค้นหาคุณควรเพิ่มfind -print0 | xargs -0 grep 'text'
-print0

1

ใช้-Iใน grep

ตัวอย่าง: grep SEARCH_ME -Irs ~/logs.


1
-Iข้ามไฟล์ไบนารี - --binary-files=without-matchมันเทียบเท่ากับ ไม่ระงับข้อความ "ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว"
mwfearnley

0

ฉันเปลี่ยนเส้นทางstderrไปยังstdoutแล้วใช้การสลับกลับรายการของ grep ( -v) เพื่อแยกสตริงคำเตือน / ข้อผิดพลาดที่ฉันต้องการซ่อน:

grep -r <pattern> * 2>&1 | grep -v "No such file or directory"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.