Apakah mungkin untuk mencari kombinasi direktori / file?

12

Saya perlu menemukan gambar, katakanlah ABC.jpg, yang saya tahu akan diprogram ke dalam direktori bernama ABC_MPSC. Saya sudah mencoba:

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

Tapi itu tidak mengembalikan apa-apa (saya benar-benar tahu di mana yang saya cari, jadi saya tahu itu ada). Apakah ada perintah find yang memungkinkan saya tidak perlu mencari secara manual?

hmmm
sumber
2
Anda juga dapat menemukannya menggunakan locate, yang seharusnya jauh lebih cepat, tetapi hanya berfungsi jika file sudah ada saat updatedbterakhir kali dijalankan.
Simon Richter

Jawaban:

17

Ada -pathpredikat yang berguna di sini:

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

The POSIX deskripsi untuk predikat yaitu:

Primer harus mengevaluasi sebagai benar jika pathname saat ini cocok dengan pola menggunakan notasi pencocokan pola yang dijelaskan dalam Notasi Pencocokan Pola. Aturan tambahan dalam Pola yang Digunakan untuk Ekspansi Nama File tidak berlaku karena ini adalah operasi yang cocok, bukan ekspansi.

Alasan Anda -name "ABC_MPSC/ABC.jpg"gagal adalah karena -namepredikat:

akan mengevaluasi sebagai benar jika nama dasar dari pathname saat ini cocok dengan pola

Dengan kata lain, -nametidak pernah melihat direktori nama file saat ini, hanya nama file dasar itu sendiri (ABC.jpg, misalnya).

Jeff Schaller
sumber
10

Dua cara (selain menggunakan-path ):

  1. Cari direktori, lalu deteksi file:

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

    Ini bergantung pada findimplementasi untuk memperluas {}ke pathname saat ini dari direktori yang ditemukan, meskipun sudah digabungkan dengan /ABC.jpg(itu tidak diperlukan untuk melakukan itu). Bisa juga ditulis sebagai

    find / -type d -name 'ABC_MPSC' \
        -exec sh -c 'test -f "$1"/ABC.jpg' sh {} \; -print
    
  2. Cari file, lalu periksa nama direktori induknya:

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

Kedua alternatif ini akan lebih lambat daripada menggunakan -pathseperti yang ditunjukkan Jeff. Saya meninggalkan mereka di sini sebagai contoh, karena mereka dapat disesuaikan untuk hal-hal lain.

Kusalananda
sumber