ทำไมการค้นหาของฉันจึงไม่เกิดซ้ำ


65

ฉันใช้คำสั่งต่อไปนี้ แต่ไม่ได้เรียกซ้ำ:

find . -name *.java

ฉันรู้ว่ามีไฟล์ java อยู่ข้างล่างในไดเรกทอรีปัจจุบัน แต่กำลังทำงานfindในไดเรกทอรีปัจจุบันเท่านั้น ฉันใช้ OS X, 10.9


@Gilles: คำถาม & คำตอบนี้ชัดเจนกว่าและมีการแปลน้อยกว่าละทิ้ง - หากหนึ่งในนั้นควรถูกปิดมันเป็นอีกคำถามหนึ่ง
goldilocks

คำตอบ:


88

ปัญหาคือคุณไม่ได้พูด-nameพารามิเตอร์ของคุณ ทำสิ่งนี้แทน:

find . -name '*.java'

คำอธิบาย

ไม่ทราบราคาเปลือกตีความ*.javaเป็นรูปแบบ glob และขยายไปยังชื่อไฟล์ใด ๆ ที่ตรงกับ glob findก่อนที่จะผ่านไป ด้วยวิธีนี้ถ้าคุณมีพูดfoo.javaในไดเรกทอรีปัจจุบันfindบรรทัดคำสั่งที่แท้จริงของจะเป็น:

find . -name foo.java

ซึ่งเห็นได้ชัดว่าจะแสดงรายการไฟล์ในไดเรกทอรีปัจจุบันเท่านั้น (เว้นแต่คุณจะเกิดขึ้นกับไฟล์ที่มีชื่อคล้ายกันบางลงในต้นไม้)

การอ้างอิงป้องกันการขยายตัวของ glob และส่งผ่านบรรทัดคำสั่งไปfindตามที่เป็นอยู่

อนึ่งหาก glob ล้มเหลวในการจับคู่ (ไม่มี*.javaไฟล์ในไดเรกทอรีปัจจุบัน) คุณจะได้รับหนึ่งในสองพฤติกรรมขึ้นอยู่กับวิธีที่เชลล์ของคุณตั้งค่าให้จัดการ globs ที่ไม่ตรงกัน (ซึ่งควบคุมโดยnullglobตัวเลือกใน Bash , ตัวอย่างเช่น):

  1. หาก glob ที่ไม่ตรงไม่ได้ถูกขยายโดยเชลล์findจะ (โดยไม่ตั้งใจคิดว่าคุณ) แสดงพฤติกรรมที่ถูกต้อง
  2. หาก glob ที่ไม่ตรงกับที่มีการขยายตัวในสตริงที่ว่างเปล่าโดยเปลือกจะบ่นว่ามันจะหายไปโต้แย้งไปยังfind-name

20

ฉันมีสถานการณ์คล้ายกันที่ฉันถูกล้อมรอบค่า -name ไว้ในเครื่องหมายคำพูด แต่ก็ยังไม่ได้รับความนิยมทั้งหมดที่ฉันหวังไว้ ฉันคิดว่ามันเป็นเพราะ symlinks และนั่นก็เป็นเช่นนั้น หากคุณต้องการบังคับให้ค้นหาเพื่อค้นหาผ่าน symlink คุณสามารถแก้ไขคำสั่งต่อไปนี้:

find -L . -name '*.java'

Symlink ก็เป็นปัญหาของฉันเช่นกัน -followเป็นคำพ้องความหมายที่อ่านได้มากขึ้น-Lตราบใดที่คุณใส่ไว้ข้างหน้าพารามิเตอร์อื่น ๆ
Noumenon

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