เมื่อใช้ grep -r คุณสามารถค้นหาไฟล์ทั้งหมดด้วย * หรือ และดูเหมือนว่าจะกลับมาเหมือนเดิม แต่มันเหมือนกันจริงหรือ
สมมติว่าฉันค้นหา "foo" จากนั้นฉันสามารถเขียนได้
grep -r foo *
หรือ
grep -r foo .
ทุกคนจะพยายามอธิบายความแตกต่างระหว่าง และ *?
เมื่อใช้ grep -r คุณสามารถค้นหาไฟล์ทั้งหมดด้วย * หรือ และดูเหมือนว่าจะกลับมาเหมือนเดิม แต่มันเหมือนกันจริงหรือ
สมมติว่าฉันค้นหา "foo" จากนั้นฉันสามารถเขียนได้
grep -r foo *
หรือ
grep -r foo .
ทุกคนจะพยายามอธิบายความแตกต่างระหว่าง และ *?
คำตอบ:
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
$
.cacheถ้าคุณใช้เครื่องหมายดอกจันคุณไม่สามารถตรงกับไฟล์ในไดเรกทอรีที่มีชื่อเริ่มต้นด้วยจุดเช่น
ปรับปรุง:
นี่เป็นเพราะ*เชลล์ถูกขยายโดยก่อนที่จะโทรgrepจึงได้รับรายชื่อแทนชื่อไดเรกทอรีเดียว (สำหรับปัจจุบัน.) เปลือกวิธีการขยายรูปแบบอาจจะปรับแต่งพารามิเตอร์เปลือก (สำหรับnullglob, nocaseglobหรืออื่น ๆ ที่bashตัวเลือก) หรือจะเป็นตัวแปรสภาพแวดล้อม (ชอบLANGหรือLC_ALL)