เป็นไปได้ไหมที่จะค้นหาไดเรกทอรี / ไฟล์รวมกัน?


12

ฉันต้องการค้นหารูปภาพพูด ABC.jpg ซึ่งฉันรู้ว่าจะถูกวางทางโปรแกรมลงในไดเรกทอรีชื่อ ABC_MPSC ฉันพยายามแล้ว:

cd /
find . -name "ABC_MPSC/ABC.jpg"

แต่นั่นไม่ได้คืนสิ่งใด (ฉันรู้จริง ๆ ว่าคนที่ฉันค้นหาคือที่ไหนฉันจึงรู้ว่ามันมีอยู่) มีคำสั่ง find ที่ทำให้ฉันไม่ต้องค้นหาด้วยตนเองหรือไม่?



2
นอกจากนี้คุณยังสามารถค้นหาโดยใช้locateซึ่งควรจะเร็วกว่าอย่างมาก แต่จะใช้ได้เฉพาะในกรณีที่ไฟล์มีอยู่แล้วเมื่อupdatedbถูกเรียกใช้ครั้งสุดท้าย
Simon Richter

คำตอบ:


17

มีภาค-pathแสดงที่มีประโยชน์ที่นี่:

find . -path '*/ABC_MPSC/ABC.jpg'

POSIX คำอธิบายสำหรับคำกริยาที่เป็น:

หลักจะต้องประเมินว่าเป็นจริงหากชื่อพา ธ ปัจจุบันตรงกับรูปแบบโดยใช้รูปแบบการจับคู่รูปแบบที่อธิบายไว้ในรูปแบบการจับคู่รูปแบบ กฎเพิ่มเติมในรูปแบบที่ใช้สำหรับการขยายชื่อไฟล์ไม่ได้ใช้เนื่องจากเป็นการดำเนินการจับคู่ไม่ใช่การขยาย

เหตุผลที่คุณ-name "ABC_MPSC/ABC.jpg"ล้มเหลวก็เพราะเพรดิเคต-name:

จะประเมินว่าเป็นจริงถ้าชื่อฐานของชื่อพา ธ ปัจจุบันตรงกันกับรูปแบบ

กล่าวอีกนัยหนึ่ง-nameไม่เคยเห็นไดเรกทอรีของชื่อไฟล์ปัจจุบันเพียงชื่อไฟล์หลักเท่านั้น (เช่น ABC.jpg เป็นต้น)


10

สองวิธี (นอกเหนือจากการใช้-path ):

  1. ค้นหาไดเรกทอรีจากนั้นตรวจหาไฟล์:

    find / -type d -name 'ABC_MPSC' -exec test -f {}/ABC.jpg \; -print
    

    สิ่งนี้ขึ้นอยู่กับการfindใช้งานเพื่อขยาย{}ไปยังชื่อพา ธ ปัจจุบันของไดเรกทอรีที่พบแม้ว่ามันจะต่อกันกับ/ABC.jpg(ไม่จำเป็นต้องทำเช่นนั้น) มันสามารถเขียนเป็น

    find / -type d -name 'ABC_MPSC' \
        -exec sh -c 'test -f "$1"/ABC.jpg' sh {} \; -print
    
  2. ค้นหาไฟล์จากนั้นตรวจสอบชื่อไดเรกทอรีหลัก:

    find / -type f -name 'ABC.jpg' -exec sh -c '
        case $(dirname "$1") in
            */ABC_MPSC) exit 0 ;;
            *) exit 1
        esac' sh {} \; -print
    

ตัวเลือกทั้งสองนี้จะช้ากว่าการใช้-pathตามวิธีที่ Jeff แสดง ฉันทิ้งพวกเขาไว้ที่นี่เพื่อเป็นตัวอย่างไม่ใช่น้อยเท่าที่ควรจะปรับให้เหมาะกับสิ่งอื่น ๆ

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