Bagaimana cara mengecualikan subdirektori dari direktori tertentu dari perintah find?

Saya mencoba mendapatkan daftar file yang dapat saya salurkan ke wc -l untuk mendapatkan jumlah kata semuanya (tidak menggunakan wc secara langsung sehingga saya dapat memfilter daftar file sebelum menggunakan perintah).

Struktur direktori saya kira-kira seperti ini:

- folder
   - file.php
   - file2.html
   - file3.php
   - folder1
   - folder2a
   - folder3b
   - folder4
- file.php
- file2.php

Saya ingin mengecualikan direktori tertentu di find saya, sebagian besar perpustakaan dan hal-hal lain yang tidak saya buat. Saya bisa melakukannya secara manual seperti:

find /var/www/html/ -type f -not -path "/var/www/html/folder/folder1" -not -path "/var/www/html/folder/folder2a" dll.

Namun, rasanya menjengkelkan karena harus menentukan semua folder secara eksplisit, dan daftarnya juga bisa berubah kapan saja. Saya sudah mencoba menggunakan /* dan /** untuk mencocokkan pola tetapi tidak berhasil juga. Apakah ada cara untuk salah satu dari not ini dalam perintah find saya sehingga saya dapat mengecualikan semua subdirektori dari direktori tertentu, namun tidak mengecualikan direktori itu sendiri? (termasuk file-filenya , tetapi tidak ada subdirektorinya)?

Berikut tebakan intuitifnya:

find /var/www/html -not -path '/var/www/html/someotherbadfolder' -type f \( ! -path "/var/www/html/folder" -maxdepth 1 \)

Tapi bahkan find mengeluh tentang ini:

find: warning: you have specified the -maxdepth option after a non-option argument -not, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it).  Please specify options before other arguments.

Jadi sepertinya maxdepth tidak mampu digabungkan dalam suatu operasi.

Ada banyak Tanya Jawab tentang mengecualikan subdirektori tertentu, tetapi tidak secara umum subdirektori apa pun dalam subdirektori tertentu.

Saya bisa membuatnya berfungsi dalam satu direktori dengan -maxdepth 1, tetapi masalahnya adalah ini adalah bagian pengecualian dari perintah yang lebih besar, dan itu tidak berfungsi setelah saya menjalankan perintah lengkap. Secara potensial, saya mungkin perlu mengecualikan subdirektori tertentu serta subdirektori apa pun di beberapa subdirektori spesifik lainnya.


person InterLinked    schedule 16.08.2020    source sumber


Jawaban (2)


Hanya dengan menemukan:

find /var/www/html -type f -not -path '/var/www/html/folder/*/*'

Jawaban asli:

Satu peretasan bisa menjadi grep -v pada keluaran find:

find /var/www/html/ -type f | grep -v "/var/www/html/folder/.*/" | wc -l
person jeremysprofile    schedule 16.08.2020
comment
Ini sempurna! Saya hanya perlu menambahkan xargs sebelum wc dan itu sesuai dengan apa yang saya cari. Saya pikir saya bisa menyalurkan beberapa kali, sekali untuk setiap folder dengan subdirektori yang perlu dikecualikan, dan mengecualikan subdirektori lain sebagai bagian dari pencarian. - person InterLinked; 16.08.2020

Dengan asumsi Anda secara khusus mencari file (yaitu bukan direktori):

find /var/www/html -type f -not -path "/var/www/html/folder/*/*"

Itu karena:

  • file langsung di bawah /var/www/html/folder bukan direktori sehingga tidak cocok dengan klausa -path.
  • direktori langsung di bawah /var/www/html/folder tidak cocok dengan -type f.
  • file di bawah subdirektori /var/www/html/folder harus memiliki / tambahan di jalurnya, sehingga cocok dengan ekspresi -path.
person root    schedule 16.08.2020
comment
Anda benar, saya belum menguji kasus ini, jawabannya sudah diperbaiki. - person root; 16.08.2020