“ grep -r foo *” และ“ grep -r foo”


10

เมื่อใช้ grep -r คุณสามารถค้นหาไฟล์ทั้งหมดด้วย * หรือ และดูเหมือนว่าจะกลับมาเหมือนเดิม แต่มันเหมือนกันจริงหรือ

สมมติว่าฉันค้นหา "foo" จากนั้นฉันสามารถเขียนได้

grep -r foo *

หรือ

grep -r foo .

ทุกคนจะพยายามอธิบายความแตกต่างระหว่าง และ *?

คำตอบ:


15

grep -r foo *ไม่ค้นหาการจับคู่ในไฟล์หรือไดเรกทอรีที่ซ่อนอยู่นอกจากนี้ยัง*ถูกขยายโดยเชลล์ดังนั้นคุณอาจพบข้อผิดพลาดนานเกินไปเมื่อมีรายการจำนวนมากในไดเรกทอรีปัจจุบันหรือข้อผิดพลาดอื่น ๆ หรือพฤติกรรมที่ไม่เหมาะสมหาก ชื่อของไฟล์หรือไดเรกทอรีบางตัวเริ่มต้นด้วยอักขระขีดกลาง

การร้องขอgrep -r foo .ไม่มีข้อบกพร่องด้านบน

Updated:

ข้อแตกต่าง: หน้าคนของ grep (@ fedora17) พูดว่า:

-r, --recursive
    Read all files under each directory, recursively, following symbolic links only if they
    are on  the  command  line.  ...

จะมีความแตกต่างเมื่อคุณดำเนินการคำสั่งนี้ในไดเรกทอรีว่าง:

$ grep -r foo *; echo $?
grep: *: No such file or directory
2
$ grep -r foo .; echo $?
1
$

4

.cacheถ้าคุณใช้เครื่องหมายดอกจันคุณไม่สามารถตรงกับไฟล์ในไดเรกทอรีที่มีชื่อเริ่มต้นด้วยจุดเช่น

ปรับปรุง:

นี่เป็นเพราะ*เชลล์ถูกขยายโดยก่อนที่จะโทรgrepจึงได้รับรายชื่อแทนชื่อไดเรกทอรีเดียว (สำหรับปัจจุบัน.) เปลือกวิธีการขยายรูปแบบอาจจะปรับแต่งพารามิเตอร์เปลือก (สำหรับnullglob, nocaseglobหรืออื่น ๆ ที่bashตัวเลือก) หรือจะเป็นตัวแปรสภาพแวดล้อม (ชอบLANGหรือLC_ALL)

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