grep ไม่สนใจคำเตือน


50

ฉันพยายามค้นหาไดเรกทอรีการติดตั้งของแพ็คเกจเฉพาะ ฉันมีคำหลักบางคำที่ใช้ซึ่งฉันพยายามค้นหาไฟล์ใดไฟล์หนึ่งโดยเฉพาะ

ระหว่าง grep ฉันต้องการรวมไฟล์cpp หรือ hเท่านั้น ฉันไม่ต้องการ grep ที่จะแสดงคำเตือนเช่นอนุญาตปฏิเสธหรือ ไม่พบไดเรกทอรี ฉันแค่อยากให้มันแสดงไฟล์ที่ตรงกัน กรุณาแนะนำฉันจะทำอย่างไร

ตอนนี้ฉันกำลังใช้

grep "My term" -ir --exclude-dir="\.svn" --include=*.{cpp,h} ./

คำตอบ:


56

คำเตือนเหล่านั้นจะถูกนำไปยังstderrสตรีมซึ่งตรงข้ามกับตัวอธิบายไฟล์มาตรฐาน คุณสามารถปิดเอาต์พุต stderr โดยเพิ่ม2>/dev/nullที่ส่วนท้ายของคำสั่งของคุณ


เฉพาะเจาะจงมากขึ้นfind . 2>/dev/null | grep 404.htmlคือสิ่งที่คำสั่งจะมีลักษณะ
csga5000

30

โดยตรงมากกว่าการกรองคำเตือนที่คุณสามารถปิดใช้งานได้โดยการเพิ่ม-s:

grep "My term" -sir --exclude-dir="\.svn" --include=*.{cpp,h} ./

มีปัญหาความเข้ากันได้กับตัวเลือกนี้ อย่างไรก็ตามนี่ไม่ควรเป็นปัญหาสำหรับการใช้งานส่วนตัว

-s, - no-messages: ระงับข้อความแสดงข้อผิดพลาดเกี่ยวกับไฟล์ที่ไม่มีอยู่หรืออ่านไม่ได้ หมายเหตุการพกพา: แตกต่างจาก grep GNU, grep รุ่นที่ 7 ของ Unix ไม่สอดคล้องกับ POSIX เนื่องจากไม่มี -q และตัวเลือก -s ทำงานเหมือนกับตัวเลือก -q ของ GNU grep grep สไตล์ USG ยังขาด -q แต่ตัวเลือก -s นั้นทำงานเหมือนกับ greu GNU สคริปต์เชลล์แบบพกพาควรหลีกเลี่ยงทั้ง -q และ -s และควรเปลี่ยนเส้นทางเอาต์พุตมาตรฐานและข้อผิดพลาดไปยัง / dev / null แทน (-s ถูกระบุโดย POSIX)


ฉันเพิ่งติดตั้ง 13.04 และฉันได้รับข้อผิดพลาดซึ่งฉันไม่ได้รับด้วย 12.04 มันเป็นสิ่งที่เปลี่ยนไปหรือไม่? ฉันคิดว่ามันเยี่ยมมากที่ grep จะหยุดเตือนเกี่ยวกับไฟล์ที่เป็นไดเรกทอรีเนื่องจากในกรณีส่วนใหญ่ฉันแค่ไม่สนใจ!
Alexis Wilke

ขออภัยฉันยังอยู่ที่ 12.10 ดังนั้นฉันไม่สามารถยืนยันได้
เซบาสเตียนเมียร์เมียร์

5

ฉันเคยได้รับข้อความที่น่ารำคาญมากมายเช่นนี้

grep: commands: Is a directory
grep: events: Is a directory
grep: views: Is a directory

เหตุผลคือการ--directoriesตั้งค่าสถานะเป็นค่าreadเริ่มต้น ฉันเปลี่ยนเป็นrecurse; หากคุณไม่ต้องการให้มันทำการค้นหาแบบเรียกซ้ำโดยอัตโนมัติคุณสามารถใช้skipแทนได้

วิธีที่ง่ายที่สุดในการจัดการกับสิ่งนี้ตลอดเวลาคือการตั้งค่าไว้ในตัวแปรสภาพแวดล้อม ใน~/.bash_profileหรือ~/.bashrcขึ้นอยู่กับ distro ของคุณ:

export GREP_OPTIONS='--directories=recurse'

ตอนนี้มันจะระงับข้อความเหล่านั้นโดยอัตโนมัติเมื่อใดก็ตามที่ฉันใช้ grep

อีกตัวเลือกหนึ่งคือธงชวเลข--no-messages -sสิ่งนี้จะกำจัดIs a directoryข้อความ แต่ก็ยังยับยั้งข้อความอื่นซึ่งอาจมีประโยชน์มากกว่า ตัวอย่างเช่นหากคุณทำการค้นหาแบบซ้อนใน*/*/*และไม่มีไฟล์รูปแบบนั้นอยู่มันจะไม่บอกคุณ


คำอธิบายที่ดี
aldr

1

วิธีทางเลือกแทนการทำgrepซ้ำกับ-ir ที่จะให้findคำสั่ง (ซึ่งเป็น recursive ค่าเริ่มต้น) จัดการสิทธิ์ที่มี-readableธงและเส้นทางที่จะไม่รวมกับธงแล้วส่งผ่านไฟล์ไปยัง-not -path "*.svn*" grepการแยกไดเรกทอรีทำผ่าน-type fการค้นหาไฟล์ปกติเท่านั้น

$ find . -not -path "*.svn*" -type f -name "*.cpp" -or -name "*.h"  -readable -exec grep "my terms" "{}" \; 

0

เมื่อทำการค้นหา recursive ack-grepในแฟ้มเฉพาะคุณมีมากดีกว่าการใช้ ไวยากรณ์ที่นี่จะเป็น:

ack-grep -i "My term" --cpp --h

หากต้องการลบข้อความแสดงข้อผิดพลาดเกี่ยวกับการอนุญาตคุณอาจต้องเรียกใช้คำสั่งเดียวกันด้วยsudo:

ack-grep -i "My term" --cpp --h

แต่ในที่สุดหากคุณต้องการค้นหาแพ็คเกจที่ติดตั้งให้ดูตัวเลือกต่าง ๆ เหล่านั้น: https://www.google.com/search?q=ubuntu%20search%20inside%20แพคเกจติดตั้ง

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