Comment exclure les sous-répertoires d'un répertoire spécifique de la commande find?

Aug 15 2020

J'essaie d'obtenir une liste de fichiers vers lesquels je peux diriger pour wc -lobtenir un nombre de mots de tous (sans utiliser wcdirectement pour que je puisse filtrer la liste de fichiers avant d'utiliser la commande).

Ma structure de répertoires ressemble à ceci:

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

Je voudrais exclure certains répertoires de mes find, en grande partie des bibliothèques et d'autres choses que je n'ai pas faites. Je peux le faire manuellement comme ceci:

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

Cependant, il est ennuyeux de devoir spécifier explicitement tous les dossiers, et la liste peut également changer à tout moment. J'ai essayé d'utiliser /*et de /**faire correspondre le modèle, mais cela ne fonctionne pas non plus. Y a-t-il un moyen pour l'un de ces "non" dans ma commande find que je puisse exclure tous les sous-répertoires d'un répertoire particulier, mais pas exclure ce répertoire lui-même? (inclure ses fichiers, mais aucun de ses sous-répertoires)?

Voici une estimation intuitive:

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

Mais se findplaint même de cela:

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.

Il semble maxdepthdonc incapable d'être combiné dans une opération.

Il y a beaucoup de questions / réponses sur l'exclusion de sous-répertoires spécifiques, mais pas de manière générique de sous-répertoires dans un sous-répertoire particulier.

J'ai pu le faire fonctionner dans un seul répertoire avec -maxdepth 1, mais le problème est qu'il s'agit d'une partie d'exclusion d'une commande plus large, et cela n'a pas fonctionné une fois que j'ai exécuté la commande complète. Potentiellement, je pourrais avoir besoin d'exclure des sous-répertoires spécifiques ainsi que tous les sous-répertoires dans plusieurs autres sous-répertoires spécifiques.

Réponses

jeremysprofile Aug 16 2020 at 01:10

Juste avec trouver:

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

Réponse originale:

Un hack pourrait être grep -vsur la sortie de find:

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

En supposant que vous recherchez spécifiquement des fichiers (c'est-à-dire pas des répertoires):

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

C'est parce que:

  • les fichiers directement sous /var/www/html/folderne sont pas des répertoires, donc ils ne correspondent pas à la -pathclause.
  • les répertoires directement sous /var/www/html/folderne correspondent pas -type f.
  • les fichiers sous les sous-répertoires de /var/www/html/folderdoivent avoir le supplément /dans le chemin, donc ils correspondent à l' -pathexpression.