การใช้ grep กับแฟล็ก --exclude-dir เพื่อแยกหลายไดเร็กทอรี


16

ฉันกำลังค้นหาแอปพลิเคชัน Ruby on Rails สำหรับคำที่ใช้grepบน OSX และฉันต้องการแยกไดเรกทอรีที่ตรงกับรูปแบบบางอย่าง

ฉันใช้คำสั่งต่อไปนี้:

grep -inRw -E 'direct' . --exclude-dir -E 'git|log|asset'

คำสั่งนี้ไม่ได้ทำในสิ่งที่ฉันคิดว่ามันจะทำ นี่คือวิธีที่ฉันคิดว่ามันจะทำงาน:

  • การค้นหาแบบคำนึงถึงขนาดตัวพิมพ์
  • n - พิมพ์หมายเลขบรรทัดที่พบรูปแบบ
  • R - ค้นหาซ้ำ
  • w - ฉันต้องการทั้งคำเท่านั้น - เช่นจับคู่ "โดยตรง" แต่ไม่ใช่ "ไดเรกทอรี"
  • -E - ใช้นิพจน์ทั่วไปที่ขยายเพิ่ม
  • 'direct' - นิพจน์ทั่วไปที่ฉันต้องการจับคู่
  • . - ค้นหาในไดเรกทอรีปัจจุบัน
  • --exclude-dir -E 'git | log | asset' - ยกเว้นไดเรกทอรีที่ตรงกับ git หรือ log หรือ asset

ในแง่ของไดเรกทอรียกเว้นคำสั่งยังคงจบลงด้วยการค้นหาใน'./git'และ'./log'ไดเรกทอรีเช่นเดียวกับใน' ./app/assets'

เห็นได้ชัดว่าฉันขาดความรู้พื้นฐาน แต่ฉันไม่รู้ว่ามันคืออะไร

คำตอบ:


16

คำอธิบายหน้าคนสำหรับตัวเลือกที่จะเรียงลำดับของความเข้าใจผิด ... มันของรูปแบบเช่นเดียวกับในglobsไม่ใช่รูปแบบเช่นเดียวกับในregex ต่อinfoหน้า :

ไม่รวม-dir = GLOB

ข้ามไดเรกทอรีบรรทัดคำสั่งด้วยส่วนต่อท้ายชื่อที่ตรงกับรูปแบบ GLOB เมื่อค้นหาแบบวนซ้ำให้ข้ามไดเรกทอรีย่อยที่มีชื่อฐานตรงกับ GLOB ละเว้นเครื่องหมายสแลชต่อท้ายที่ซ้ำซ้อนใน GLOB

ดังนั้นในกรณีของคุณคุณสามารถเรียกใช้:

grep -inRw -E 'direct' . --exclude-dir={git,log,assets}

ยกเว้นไดเรกทอรีชื่อgit, logและassetsหรือเช่น

grep -inRw -E 'direct' . --exclude-dir={\*git,asset\*}

จะไม่รวมชื่อไดเรกทอรีสิ้นสุดในหรือเริ่มต้นด้วยgitasset


น่าสนใจมาก. ฉันเดาว่าฉันควรจะดูว่า glob คืออะไร
Steven L.

ฉันขอโทษ แต่ดูเหมือนว่าจะไม่มีการทำงานใด ๆ มันจะช่วยได้ไหมถ้าฉันบอกว่าฉันใช้ grep รุ่นนี้: grep (grep BSD) 2.5.1-FreeBSD?
Steven L.

ฉันนิ่งงันเพราะฉันอ่านคู่มือสำหรับ grep bsd ( freebsd.org/cgi/man.cgi?query=grep&sektion=&n=1 ) และไม่มีการพูดถึง --exclude-dir หุยฮา
Steven L.

2
ตกลง - ฉันเห็นปัญหาตอนนี้ ต้องเป็น grep เวอร์ชันที่แก้ไขโดยระบบ Apple เท่านั้น ฉันใช้ Mac OS X ฉันขอโทษสำหรับความสับสนที่นี่ ฉันแน่ใจว่ามีฟอรัมที่อื่นบน stackexchange ที่ฉันสามารถโพสต์ได้
Steven L.

@ user245185 คุณเป็น BSD หรือ OSX หรือไม่ ทั้งคู่อยู่ในหัวข้อที่นี่ แต่โปรดแก้ไขคำถามของคุณและบอกเราว่าคุณใช้ระบบปฏิบัติการใดอยู่ พฤติกรรมของเครื่องมือมาตรฐานแตกต่างกันระหว่างการใช้งานในขณะที่คุณกำลังค้นหา
terdon

8

--exclude-dir|ไม่เข้าใจ

อย่างไรก็ตามคุณสามารถรับผลกระทบเดียวกันได้โดยการระบุ--exclude-dirหลายครั้งหนึ่งครั้งสำหรับแต่ละไดเรกทอรีที่คุณต้องการยกเว้น:

grep -inRw -E --exclude-dir 'asset' --exclude-dir 'git' --exclude-dir 'log' 'direct'

มันใช้งานได้สำหรับฉัน ผมอยากที่จะไม่รวมไดเรกทอรีบ้าน แต่มันไม่ได้ทำงานร่วมกับตัวเลือกอื่น ๆ --exclude-dir={home}เช่น ฉันทำงานเมื่อฉันพิมพ์--exclude-dir 'home'
Mubin Icyer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.