เมื่อใช้ 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
)