Come escludere le sottodirectory di una directory specifica dal comando find?

Aug 15 2020

Sto cercando di ottenere un elenco di file a cui posso indirizzare wc -lper ottenere un conteggio delle parole di tutti loro (non utilizzando wcdirettamente in modo da poter filtrare l'elenco dei file prima di utilizzare il comando).

La mia struttura di directory è qualcosa del genere:

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

Vorrei escludere alcune directory nelle mie find, in gran parte librerie e altre cose che non ho creato. Posso farlo manualmente in questo modo:

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

Tuttavia, è fastidioso dover specificare esplicitamente tutte le cartelle e anche l'elenco potrebbe cambiare in qualsiasi momento. Ho provato a usare /*e /**per la corrispondenza del pattern, ma neanche questo funziona. C'è un modo per uno di questi "non" nel mio comando find che posso escludere tutte le sottodirectory di una particolare directory, ma non escludere quella directory stessa? (includere i suoi file, ma non le sue sottodirectory)?

Ecco un'ipotesi intuitiva:

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

Ma si findlamenta anche di questo:

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.

Quindi sembra che maxdepthsia incapace di essere combinato in un'operazione.

Ci sono molte domande e risposte sull'esclusione di sottodirectory specifiche, ma non genericamente alcuna sottodirectory in una particolare sottodirectory.

Sono riuscito a farlo funzionare in una singola directory con -maxdepth 1, ma il problema è che questa è una parte di esclusione di un comando più grande e non ha funzionato una volta eseguito il comando completo. Potenzialmente, potrei dover escludere sottodirectory specifiche così come eventuali sottodirectory in diverse altre sottodirectory specifiche.

Risposte

jeremysprofile Aug 16 2020 at 01:10

Solo con trova:

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

Risposta originale:

Un hack potrebbe essere grep -vsull'output di find:

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

Supponendo che tu stia cercando specificamente file (cioè non directory):

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

È perché:

  • i file direttamente sotto /var/www/html/foldernon sono directory quindi non corrispondono alla -pathclausola.
  • le directory direttamente sotto /var/www/html/foldernon corrispondono -type f.
  • i file nelle sottodirectory di /var/www/html/folderdevono contenere l'extra /nel percorso, quindi corrispondono -pathall'espressione.