Comment exclure les sous-répertoires d'un répertoire spécifique de la commande find?
J'essaie d'obtenir une liste de fichiers vers lesquels je peux diriger pour wc -l
obtenir un nombre de mots de tous (sans utiliser wc
directement 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 find
plaint 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 maxdepth
donc 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
Juste avec trouver:
find /var/www/html -type f -not -path '/var/www/html/folder/*/*'
Réponse originale:
Un hack pourrait être grep -v
sur la sortie de find:
find /var/www/html/ -type f | grep -v "/var/www/html/folder/.*/" | wc -l
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/folder
ne sont pas des répertoires, donc ils ne correspondent pas à la-path
clause. - les répertoires directement sous
/var/www/html/folder
ne correspondent pas-type f
. - les fichiers sous les sous-répertoires de
/var/www/html/folder
doivent avoir le supplément/
dans le chemin, donc ils correspondent à l'-path
expression.