ค้นหาคำสั่ง: วิธีการเพิกเฉยกรณีและปัญหา?


170

ฉันกำลังมองหาไฟล์ "WSFY321.c" ในลำดับชั้นไดเรกทอรีขนาดใหญ่
โดยปกติฉันจะใช้GNU ค้นหา : find . -name "WSFY321.c"
แต่ฉันไม่ทราบว่าเป็นตัวพิมพ์ใหญ่อาจเป็นตัวพิมพ์ใหญ่ตัวพิมพ์เล็กหรือทั้งสองอย่าง

วิธีที่ง่ายที่สุดในการค้นหาไฟล์นี้คืออะไร?
มีอะไรที่ดีไปกว่านี้find . | grep -i "WSFY321.c"?

คำตอบ:


214

GNU รุ่นล่าสุดfindมีการ-inameตั้งค่าสถานะสำหรับการค้นหาชื่อที่ไม่คำนึงถึงขนาดตัวพิมพ์

find . -iname "WSFY321.c"

6
นอกจากนี้เนื่องจากคุณกำลังมองหาไฟล์โดยเฉพาะคุณอาจจะสามารถกำจัดเห็บอีกสองสามอันด้วยการ-type fตั้งค่าสถานะดังนั้นมันจะไม่รบกวนการดูชื่อถ้า inode เป็นไดเรกทอรี แต่นั่นคือระดับของการเพิ่มประสิทธิภาพอวดความคิด ...
Shadur

สำหรับการทำงานกับ regex คุณสามารถทำได้find . -iname \*WSFY321.c\* -type f
Benj

40

ด้วย GNU find หรือ find รุ่นอื่น ๆ ที่มี:

find . -iname 'WSFY321.c'

กับรุ่นอื่น ๆ :

find . -name '[Ww][Ss][Ff][Yy]321.[Cc]'

หรือการประนีประนอมที่ช้ากว่า แต่ง่ายต่อการพิมพ์:

find . -name '????321.c' | grep -i '/WSFY[^/]*$'

หรือเป็น zsh:

print -rl -- **/(#i)WSFY321.c

@Gillesgrepรุ่นกรองกรณีบนเท่านั้นและฉันไม่เข้าใจ '[^ /]' .. (ไม่ได้ /)
Peter.O

@Gilles อาร์กิวเมนต์ที่ใช้อัญประกาศเดี่ยวในกรณีแรกคืออะไร (ชื่อไฟล์ที่แน่นอน) โดยไม่มีเครื่องหมายอัญประกาศเลย?
แบร์นฮาร์ด

@ Peter.O ไม่*หลังจาก/ในเวอร์ชั่นทุบตี grep -iฉันหมายถึง ผมใช้[^/]*มากกว่าเพื่อที่จะไม่จับไฟล์ในไดเรกทอรีที่มีชื่อขึ้นต้นด้วย.* WSFY
Gilles

5
@Bernhard Consistency
Gilles

ขอบคุณ Gilles: ฉันลบความคิดเห็นก่อนหน้านี้ด้วยไวยากรณ์ที่ไม่ถูกต้องและทดสอบเวอร์ชันที่แก้ไขแล้ว แต่มันไม่สามารถใช้งานได้หากไม่มี * (ด้วยเหตุผลที่ไม่คาดคิดสำหรับฉันอย่างน้อย) ตัวเลือกกรณีตายไม่ได้ทำงาน: shopt -s extglob nocaseglob globstar; printf '%s\n' **/WSFY321.c... ฉันคิดว่านั่นคือเหตุผลว่าทำไมจึงเรียกว่าnocase glob : มันจะทำงานเฉพาะในบริบทของ glob ที่ (หรือเพื่อให้ดูเหมือนว่า)
Peter.O

1

โซลูชันสองประการสำหรับ macOS:

ใช้ GNU find:

brew install findutils --with-default-names
# restart Terminal
find . -iname 'WSFY321.c'

ใช้ GNU sed:

brew install gnu-sed --default-names
# restart Terminal
find -name "$(sed 's|\([[:alpha:]]\)|[\U\1\L\1]|g' <<<'WSFY321.c')"

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