Bir dizin / dosya kombinasyonu aramak mümkün müdür?


12

ABC.jpg, programsal olarak ABC_MPSC adlı bir dizine yerleştirilmiş olacağını bildiğim bir görüntü bulmam gerekiyor. Denedim:

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

Ama bu hiçbir şey döndürmez (aslında aradığım şeyin nerede olduğunu biliyorum, bu yüzden var olduğunu biliyorum). Manuel olarak arama yapmama izin verebilecek bir find komutu var mı?



2
Ayrıca locate, önemli ölçüde daha hızlı olması gereken kullanarak da bulabilirsiniz , ancak yalnızca dosya updatedbson çalıştırıldığında zaten mevcutsa çalışır.
Simon Richter

Yanıtlar:


17

Burada -pathyararlı bir yüklem var:

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

Söz konusu yüklem için POSIX açıklaması :

Birincil, geçerli yol adı, Kalıp Eşleme Notasyonunda açıklanan kalıp eşleme gösterimini kullanarak kalıpla eşleşiyorsa doğru olarak değerlendirilir. Dosya Adı Genişletmesi için Kullanılan Kalıplardaki ek kurallar geçerli değildir, çünkü bu bir genişletme değil, eşleşen bir işlemdir.

-name "ABC_MPSC/ABC.jpg"Başarısız olmanızın nedeni -nameyüklem:

geçerli yol adının taban adı kalıpla eşleşiyorsa doğru olarak değerlendirilir

Başka bir deyişle, geçerli dosya adının dizinini-name asla görmez , yalnızca temel dosya adının kendisini (örneğin ABC.jpg) görür.


10

İki yol ( kullanmak-path dışında ):

  1. Dizini arayın, ardından dosyayı tespit edin:

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

    Bu , birleştirilmiş olsa bile, bulunan dizinin geçerli yol findadına genişletilmesi {}için uygulamaya dayanır /ABC.jpg(bunu yapmak gerekli değildir ). Ayrıca şu şekilde de yazılabilir:

    find / -type d -name 'ABC_MPSC' \
        -exec sh -c 'test -f "$1"/ABC.jpg' sh {} \; -print
    
  2. Dosyayı arayın, ardından üst dizin adını kontrol edin:

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

Bu alternatiflerin her ikisi -pathde Jeff'in gösterdiği şekilde kullanmaktan daha yavaş olacaktır . Onları burada bırakıyorum, belki de başka şeylere uyarlanabildikleri için.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.