ฉันใช้คำสั่งต่อไปนี้ แต่ไม่ได้เรียกซ้ำ:
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