ฉันจะค้นหาไฟล์ในไดเรกทอรีปัจจุบันที่ไม่มีคำว่าfoo
(ใช้grep
) ได้อย่างไร?
ฉันจะค้นหาไฟล์ในไดเรกทอรีปัจจุบันที่ไม่มีคำว่าfoo
(ใช้grep
) ได้อย่างไร?
คำตอบ:
หาก grep ของคุณมีตัวเลือก-L
(หรือ--files-without-match
):
$ grep -L "foo" *
GREP_OPTIONS='--exclude-dir=.svn --exclude-dir=.git'
: ^)
-rL
แทน-L
เพื่อจับคู่ไดเรกทอรีย่อย
grep -L 'foo' -- *
มาตรฐานคือคำสั่งที่ใช้ตัวเลือกยาวใช้--
เพื่อระบุว่าไม่มีตัวเลือกเพิ่มเติมหลังจากจุดนี้
ack
ลองดูที่ มันจะ.svn
ยกเว้นสำหรับคุณโดยอัตโนมัติให้การแสดงออกปกติ Perl และให้คุณดาวน์โหลดง่าย ๆ ของโปรแกรม Perl เดียว
สิ่งที่คุณกำลังมองหาควรเทียบเท่าในack
:
ack -L foo
คุณสามารถทำได้ด้วย grep เพียงอย่างเดียว (โดยไม่ต้องค้นหา)
grep -riL "foo" .
นี่คือคำอธิบายของพารามิเตอร์ที่ใช้ grep
-L, --files-without-match
each file processed.
-R, -r, --recursive
Recursively search subdirectories listed.
-i, --ignore-case
Perform case insensitive matching.
หากคุณใช้l
(ลดระดับ) คุณจะได้สิ่งที่ตรงกันข้าม (ไฟล์ที่มีข้อมูลตรงกัน)
-l, --files-with-matches
Only the names of files containing selected lines are written
คำสั่งต่อไปนี้ให้ไฟล์ทั้งหมดที่ไม่มีรูปแบบfoo
:
find . -not -ipath '.*svn*' -exec grep -H -E -o -c "foo" {} \; | grep 0
grep '0$'
จะจับคู่ไฟล์ที่มีทวีคูณของ 10 บรรทัดด้วย! คุณต้องการgrep ':0$'
ที่จะตรวจสอบ ': 0' ที่ท้ายบรรทัดอย่างชัดเจน จากนั้นคุณจะได้รับไฟล์ที่มีเส้นตรงเป็นศูนย์เท่านั้น
ไม่รวมคำสั่งต่อความจำเป็นในการค้นหาเพื่อกรองออกมาโฟลเดอร์โดยใช้เป็นครั้งที่สองsvn
grep
grep -rL "foo" ./* | grep -v "\.svn"
คุณจะต้อง:
find . -not -ipath '.*svn*' -exec grep -H -E -o -c "foo" {} \; | grep :0\$
ฉันโชคดีกับ
grep -H -E -o -c "foo" */*/*.ext | grep ext:0
ความพยายามของฉันgrep -v
เพียงแค่ให้ทุกบรรทัดโดยไม่มี "foo"
ปัญหา
ฉันต้องการ refactor โครงการขนาดใหญ่ที่ใช้.phtml
ไฟล์เพื่อเขียน HTML โดยใช้โค้ด PHP แบบอินไลน์ ฉันต้องการใช้เทมเพลตหนวดแทน ฉันต้องการหา.phtml
ไจล์ซึ่งไม่มีสตริงnew Mustache
เนื่องจากยังคงต้องเขียนใหม่
สารละลาย
find . -iname '*.phtml' -exec grep -H -E -o -c 'new Mustache' {} \; | grep :0$ | sed 's/..$//'
คำอธิบาย
ก่อนท่อ:
หา
find .
ค้นหาไฟล์ซ้ำโดยเริ่มต้นในไดเรกทอรีนี้
-iname '*.phtml'
ชื่อไฟล์ต้องมี.phtml
( i
ทำให้ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่)
-exec 'grep -H -E -o -c 'new Mustache' {}'
รันgrep
คำสั่งบนแต่ละพา ธ ที่ตรงกัน
grep
-H
พิมพ์ส่วนหัวชื่อไฟล์ด้วยบรรทัดเอาต์พุตเสมอ
-E
ตีความรูปแบบการแสดงออกปกติเพิ่มเติม (เช่นบังคับ grep เพื่อทำหน้าที่เป็น egrep)
-o
พิมพ์เฉพาะส่วนที่ตรงกันของบรรทัด
-c
เฉพาะจำนวนบรรทัดที่เลือกเท่านั้นที่ถูกเขียนไปยังเอาต์พุตมาตรฐาน
นี่จะให้รายการเส้นทางของไฟล์ทั้งหมดที่ลงท้าย.phtml
ด้วยจำนวนครั้งที่สตริงnew Mustache
เกิดขึ้นในแต่ละไฟล์
$> find . -iname '*.phtml$' -exec 'grep -H -E -o -c 'new Mustache' {}'\;
./app/MyApp/Customer/View/Account/quickcodemanagestore.phtml:0
./app/MyApp/Customer/View/Account/studio.phtml:0
./app/MyApp/Customer/View/Account/orders.phtml:1
./app/MyApp/Customer/View/Account/banking.phtml:1
./app/MyApp/Customer/View/Account/applycomplete.phtml:1
./app/MyApp/Customer/View/Account/catalogue.phtml:1
./app/MyApp/Customer/View/Account/classadd.phtml:0
./app/MyApp/Customer/View/Account/orders-trade.phtml:0
ไพพ์แรกgrep :0$
กรองรายการนี้เพื่อรวมเฉพาะบรรทัดที่ลงท้ายด้วย:0
:
$> find . -iname '*.phtml' -exec grep -H -E -o -c 'new Mustache' {} \; | grep :0$
./app/MyApp/Customer/View/Account/quickcodemanagestore.phtml:0
./app/MyApp/Customer/View/Account/studio.phtml:0
./app/MyApp/Customer/View/Account/classadd.phtml:0
./app/MyApp/Customer/View/Account/orders-trade.phtml:0
ไพsed 's/..$//'
พ์ที่สองตัดอักขระสองตัวสุดท้ายของแต่ละบรรทัดทิ้งไว้เพียงพา ธ ของไฟล์
$> find . -iname '*.phtml' -exec grep -H -E -o -c 'new Mustache' {} \; | grep :0$ | sed 's/..$//'
./app/MyApp/Customer/View/Account/quickcodemanagestore.phtml
./app/MyApp/Customer/View/Account/studio.phtml
./app/MyApp/Customer/View/Account/classadd.phtml
./app/MyApp/Customer/View/Account/orders-trade.phtml
หากคุณใช้คอมไพล์ระบบจะทำการค้นหาไฟล์ที่ถูกติดตามทั้งหมด:
git grep -L "foo"
และคุณสามารถค้นหาไฟล์ย่อยที่ถูกติดตามหากคุณเปิดไดเรกทอรีย่อย ** เปิดใช้งาน ( shopt -s globstar
ใน. bashrc ดูที่นี่ ):
git grep -L "foo" -- **/*.cpp
grep ของฉันไม่มีตัวเลือก -L ฉันหาวิธีแก้ปัญหาเพื่อให้ได้สิ่งนี้
ความคิดคือ:
สร้างความแตกต่างระหว่างไฟล์ดัมพ์ 2 ด้วยคำสั่ง diff
grep 'foo' *.log | cut -c1-14 | uniq > txt1.txt
grep * *.log | cut -c1-14 | uniq > txt2.txt
diff txt1.txt txt2.txt | grep ">"
diff
ระหว่างสองสตรีมเอาท์พุท (ฉันคิดว่าคุณล้อมรอบคำสั่งด้วยวงเล็บและมีวงเล็บมุมอยู่ตรงนั้นด้วย) หากระบบของคุณรองรับซึ่งฉันเดา เป็นคำถามเพราะมันไม่สนับสนุนgrep -L
find *20161109* -mtime -2|grep -vwE "(TRIGGER)"
คุณสามารถระบุตัวกรองภายใต้ "ค้นหา" และสตริงการยกเว้นภายใต้ "grep -vwE" ใช้ mtime under find หากคุณต้องการกรองเวลาที่แก้ไขด้วย
ตามที่แสดงความคิดเห็นโดย @tukan มีรายงานข้อผิดพลาดแบบเปิดสำหรับ Ag เกี่ยวกับ-L
/ --files-without-matches
flag:
เนื่องจากมีความคืบหน้าเล็กน้อยในการรายงานข้อผิดพลาด-L
ตัวเลือกที่กล่าวถึงด้านล่างไม่ควรเชื่อถือได้และตราบใดที่ข้อผิดพลาดยังไม่ได้รับการแก้ไข ใช้วิธีการต่าง ๆ ที่นำเสนอในชุดข้อความนี้แทน อ้างถึงความคิดเห็นสำหรับรายงานข้อผิดพลาด [highlight mine]:
มีการอัพเดทอะไรบ้าง?
-L
ละเว้นการจับคู่ในบรรทัดแรกของไฟล์อย่างสมบูรณ์ ดูเหมือนว่าถ้าสิ่งนี้จะไม่ได้รับการแก้ไขในไม่ช้าธงควรจะถูกลบออกทั้งหมดเนื่องจากจะไม่สามารถทำงานได้อย่างมีประสิทธิภาพตามที่โฆษณาไว้เลย
ในฐานะทางเลือกที่ทรงพลังgrep
คุณสามารถใช้The Silver Searcher - Ag :
เครื่องมือค้นหารหัสที่คล้ายกับแอ๊โดยมุ่งเน้นที่ความเร็ว
มองไปที่man ag
เราพบ-L
หรือ--files-without-matches
ตัวเลือก:
... OPTIONS ... -L --files-without-matches Only print the names of files that don´t contain matches.
คือค้นหาไฟล์ที่ไม่ตรงกันซ้ำfoo
ๆ จากไดเรกทอรีปัจจุบัน:
ag -L foo
หากต้องการค้นหาเฉพาะไดเรกทอรีปัจจุบันสำหรับไฟล์ที่ไม่ตรงกันfoo
เพียงระบุ--depth=0
การสอบถามซ้ำ:
ag -L foo --depth 0
-L
ข้อผิดพลาด - github.com/ggreer/the_silver_searcher/issues/238
อีกทางเลือกหนึ่งเมื่อ grep ไม่มีตัวเลือก -L (ตัวอย่างเช่น IBM AIX) โดยไม่มีอะไรยกเว้น grep และเชลล์:
for file in * ; do grep -q 'my_pattern' $file || echo $file ; done
grep -irnw "filepath" -ve "pattern"
หรือ
grep -ve "pattern" < file
คำสั่งด้านบนจะให้ผลลัพธ์กับเราเมื่อ -v ค้นหาส่วนผกผันของรูปแบบที่ถูกค้นหา
-l
ตัวเลือกเพื่อพิมพ์เฉพาะชื่อไฟล์ แต่ตอนนี้ยังคงพิมพ์ชื่อของไฟล์ใด ๆ ที่มีบรรทัดใด ๆที่ไม่มีรูปแบบ ฉันเชื่อว่า OP ต้องการค้นหาไฟล์ที่ไม่มีบรรทัดที่มีรูปแบบ
คำสั่งต่อไปนี้สามารถช่วยคุณกรองบรรทัดที่มีซับสตริง "foo"
cat file | grep -v "foo"