ฉันใช้คำสั่งต่อไปนี้ แต่ไม่ได้เรียกซ้ำ:
find . -name *.java
ฉันรู้ว่ามีไฟล์ java อยู่ข้างล่างในไดเรกทอรีปัจจุบัน แต่กำลังทำงานfindในไดเรกทอรีปัจจุบันเท่านั้น ฉันใช้ OS X, 10.9
ฉันใช้คำสั่งต่อไปนี้ แต่ไม่ได้เรียกซ้ำ:
find . -name *.java
ฉันรู้ว่ามีไฟล์ java อยู่ข้างล่างในไดเรกทอรีปัจจุบัน แต่กำลังทำงานfindในไดเรกทอรีปัจจุบันเท่านั้น ฉันใช้ OS X, 10.9
คำตอบ:
ปัญหาคือคุณไม่ได้พูด-nameพารามิเตอร์ของคุณ ทำสิ่งนี้แทน:
find . -name '*.java'
คำอธิบาย
ไม่ทราบราคาเปลือกตีความ*.javaเป็นรูปแบบ glob และขยายไปยังชื่อไฟล์ใด ๆ ที่ตรงกับ glob findก่อนที่จะผ่านไป ด้วยวิธีนี้ถ้าคุณมีพูดfoo.javaในไดเรกทอรีปัจจุบันfindบรรทัดคำสั่งที่แท้จริงของจะเป็น:
find . -name foo.java
ซึ่งเห็นได้ชัดว่าจะแสดงรายการไฟล์ในไดเรกทอรีปัจจุบันเท่านั้น (เว้นแต่คุณจะเกิดขึ้นกับไฟล์ที่มีชื่อคล้ายกันบางลงในต้นไม้)
การอ้างอิงป้องกันการขยายตัวของ glob และส่งผ่านบรรทัดคำสั่งไปfindตามที่เป็นอยู่
อนึ่งหาก glob ล้มเหลวในการจับคู่ (ไม่มี*.javaไฟล์ในไดเรกทอรีปัจจุบัน) คุณจะได้รับหนึ่งในสองพฤติกรรมขึ้นอยู่กับวิธีที่เชลล์ของคุณตั้งค่าให้จัดการ globs ที่ไม่ตรงกัน (ซึ่งควบคุมโดยnullglobตัวเลือกใน Bash , ตัวอย่างเช่น):
findจะ (โดยไม่ตั้งใจคิดว่าคุณ) แสดงพฤติกรรมที่ถูกต้องfind-nameฉันมีสถานการณ์คล้ายกันที่ฉันถูกล้อมรอบค่า -name ไว้ในเครื่องหมายคำพูด แต่ก็ยังไม่ได้รับความนิยมทั้งหมดที่ฉันหวังไว้ ฉันคิดว่ามันเป็นเพราะ symlinks และนั่นก็เป็นเช่นนั้น หากคุณต้องการบังคับให้ค้นหาเพื่อค้นหาผ่าน symlink คุณสามารถแก้ไขคำสั่งต่อไปนี้:
find -L . -name '*.java'
-followเป็นคำพ้องความหมายที่อ่านได้มากขึ้น-Lตราบใดที่คุณใส่ไว้ข้างหน้าพารามิเตอร์อื่น ๆ
หลบหนี *
find . -name \*.java