Bagaimana cara mengecualikan subdirektori dari direktori tertentu dari perintah find?

Aug 15 2020

Saya mencoba untuk mendapatkan daftar file yang dapat saya gunakan wc -luntuk mendapatkan jumlah kata dari semuanya (tidak menggunakan wcsecara langsung sehingga saya dapat memfilter daftar file sebelum menggunakan perintah).

Struktur direktori saya adalah seperti ini:

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

Saya ingin mengecualikan direktori tertentu di findsebagian besar perpustakaan saya dan hal-hal lain yang tidak saya buat. Saya dapat 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, menjengkelkan harus secara eksplisit menentukan semua folder, dan daftar juga dapat berubah kapan saja. Saya sudah mencoba menggunakan /*dan /**untuk mencocokkan pola tetapi itu juga tidak berhasil. Apakah ada cara untuk salah satu dari "tidak" ini dalam perintah find saya sehingga saya dapat mengecualikan semua subdirektori dari direktori tertentu, tetapi tidak mengecualikan direktori itu sendiri? (sertakan file-nya, tetapi bukan subdirektorinya)?

Berikut tebakan intuitifnya:

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

Tetapi bahkan findmengeluh 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 maxdepthtidak bisa digabungkan dalam sebuah operasi.

Ada banyak Tanya Jawab tentang mengecualikan subdirektori tertentu, tetapi tidak secara umum setiap subdirektori 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 setiap subdirektori di beberapa subdirektori spesifik lainnya.

Jawaban

jeremysprofile Aug 16 2020 at 01:10

Hanya dengan menemukan:

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

Jawaban asli:

Satu peretasan dapat terjadi grep -vpada hasil pencarian:

find /var/www/html/ -type f | grep -v "/var/www/html/folder/.*/" | wc -l
2 root Aug 16 2020 at 01:13

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 yang berada langsung di bawah /var/www/html/folderbukanlah direktori sehingga tidak cocok dengan -pathklausulnya.
  • direktori langsung di bawah /var/www/html/foldertidak cocok -type f.
  • file di bawah subdirektori /var/www/html/folderharus memiliki ekstra /di jalurnya, sehingga cocok dengan -pathekspresi.