¿Cómo excluir subdirectorios de un directorio específico del comando de búsqueda?

Aug 15 2020

Estoy tratando de obtener una lista de archivos a los que puedo canalizar para wc -lobtener un recuento de palabras de todos ellos (no usarlos wcdirectamente para poder filtrar la lista de archivos antes de usar el comando).

Mi estructura de directorio es algo como esto:

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

Me gustaría excluir ciertos directorios de mis find, principalmente bibliotecas y otras cosas que no hice. Puedo hacer eso manualmente así:

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

Sin embargo, es molesto tener que especificar explícitamente todas las carpetas, y la lista también podría cambiar en cualquier momento. Intenté usar /*y /**hacer coincidir el patrón, pero eso tampoco funciona. ¿Hay alguna forma de que uno de estos "no" en mi comando de búsqueda pueda excluir todos los subdirectorios de un directorio en particular, pero no excluir ese directorio en sí? (incluya sus archivos, pero no ninguno de sus subdirectorios)?

Aquí hay una suposición intuitiva:

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

Pero incluso se findqueja de esto:

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.

Por lo que parece maxdepthque no se puede combinar en una operación.

Hay muchas preguntas y respuestas sobre la exclusión de subdirectorios específicos, pero no genéricamente ningún subdirectorio en un subdirectorio en particular.

Pude hacer que funcionara en un solo directorio con -maxdepth 1, pero el problema es que esta es una parte de exclusión de un comando más grande, y eso no funcionó una vez que ejecuté el comando completo. Potencialmente, podría necesitar excluir subdirectorios específicos, así como cualquier subdirectorio en varios otros subdirectorios específicos.

Respuestas

jeremysprofile Aug 16 2020 at 01:10

Solo con encontrar:

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

Respuesta original:

Un truco podría estar grep -ven la salida de find:

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

Suponiendo que está buscando específicamente archivos (es decir, no directorios):

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

Eso es porque:

  • los archivos directamente debajo /var/www/html/folderno son directorios, por lo que no coinciden con la -pathcláusula.
  • los directorios directamente debajo /var/www/html/folderno coinciden -type f.
  • los archivos bajo subdirectorios de /var/www/html/folderdeben tener el extra /en la ruta, para que coincidan con la -pathexpresión.